10.22.2015

Linux C pipe()

繼上一次介紹的popen(), pclose(), perror()等高階的管線函式之後,這一次要紀錄的是比較低階的pipe()。函式原型如下:

功能說明:建立管線

標頭檔:#include <unistd.h>

函式宣告:int pipe(int filedes[2]);

函式說明:pipe()會建立管線,並將FD由引數filedes陣列傳回。filedes[0]為管線的讀取端;filedes[1]為寫入端。

回傳值:若成功則傳回0;失敗傳回-1。

範例:
// pipe.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>

int 
main(void)
{
    int fd[2], nRet = -1;
    char szTemp[32], data[] = "Hello!! World!! \n";
    unsigned int unByte = 0U;

    bzero((void *)&fd, sizeof(int) * 2);
    nRet = pipe(fd);
    if (nRet == 0) {
        unByte = write(fd[1], (void *)&data, strlen(data));
        printf("Write %d byte data to pipe-fd[1] (%d)!! \n", unByte, fd[1]);
        memset(&szTemp, '\0', sizeof(char) * 32);
        unByte = read(fd[0], (void *)&szTemp, sizeof(char) * 32);
        printf("Read %d byte data from pipe-fd[0] (%d)!! \n", unByte, fd[0]);
    }
    else
        perror("Create pipe() dailed!! \n");

    return 0;
}
基本上這個範例的寫法並沒有任何意義,因為實務上並不會這樣用。比較實際的用法應該是Process A fork()出一個Process B;Process B在處理一些事情,處理完之後,再透過pipe()傳送回Process A來做其它的事情。這個案例僅是呈現pipe()搭配read(), write()的用法而已。

執行結果:

[root@localhost ~]# ./pipe
Write 17 byte data to pipe-fd[1] (4)!!
Read 17 byte data from pipe-fd[0] (3)!!
[root@localhost ~]#

從Read()-Write()的讀寫資料大小都是17 Bytes來判斷,我們所建立的pipe()管線在讀寫資料都是正常地!!

沒有留言:

張貼留言