各位看官們,大家好,上一回中咱們說的是使用管道進行進程間通信的例子,這一回咱們說的例子是:使用管道進行進程間通信,不過使用管道的方式不相同。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
我們在前面章回中介紹了三種管道,這一回我們介紹第二種管道及其使用方法。最主要還是讓大家明白如何使用管道進行進程間的通信。
第二種管道我稱之為入門級管道。在介紹它之前,我們先介紹一個函數:pipe.
int pipe(int file_descriptor[2])
該函數用來創建管道,並且得到兩個文件描述符供我們使用; 該函數只有一個參數,參數為int類型的數組,數組中有兩個元素。兩個元素都是文件描述符; 管道通過第二個元素指向的文件把數據寫入管道,並且通過第一個元素指向的文件從管道中讀取數據; 該函數執行成功時返回0,否則返回-1,並且修改errno的值,不同的值代表不同的錯誤。
明白這個函數後,我們接下來介紹入門級管道的使用方法,詳細內容如下:
1.使用pipe函數創建管道,並且得到兩個文件描述符; 2.在子進程中使用write系統調用通過第二個文件描述符向管道中寫入數據; 3.在父進程中使用read系統調用通過第一個文件描述符從管道中讀取數據;我們接下來使用具體的例子進行說明,下面是詳細的代碼:
int main()
{
char input[] = "IPC by pipe";
char output[BUFSIZ+1];
int fd_pipe[2];
int count = 0;
int stat_value;
pid_t pid,pid_res;
memset(output,'\0',sizeof(output));
if(pipe(fd_pipe) == 0) //創建管道
{
pid = fork();
if(pid > 0)
{
pid_res = wait(&stat_value);
if(pid_res > 0)
{
count = read(fd_pipe[0],output,BUFSIZ); //從管道中讀取數據
printf("father process read %d characters,they are: %s \n",count,output);
}
}
else if(pid == 0)
{
count = write(fd_pipe[1],input,strlen(input)); //向管道中寫入數據
printf("son process write %d characters,they are : %s \n",count,input);
}
else
{
printf("create process failed \n");
return 1;
}
}
return 0;
}
從上面的代碼中我們可以看到:
首先是在子進程中使用write向管道中寫入數據,寫入數據是通過第二個文件描述符來實現的。 接著在父進程中使用read從管道中讀取數據,讀取數據是通過第一個文件描述符來實現的。 在父進程中我們還使用了wait來同步進程,以確保子進程向管道中寫入數據後,父進程再從管道中讀取數據。看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。
下面是程序的運行結果,請大家參考:
./s //運行編譯後的程序
son process write 11 characters,they are : IPC by pipe //子進程向管道中寫入數據
father process read 11 characters,they are: IPC by pipe //父進程從管道中讀取數據
各位看官,關於使用管道進行進程間通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。