歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 進程間通訊之創建無名管道和讀寫無名管道

Linux進程間通訊的方式:

1. 管道(pipe)和有名管道(FIFO).
2. 信號(signal)
3. 消息隊列
4. 共享內存
5. 信號量
6. 套接字(socket) 

管道通訊:

無名管道:由pipe()函數創建,int pipe(int  filedis[2]), 當管道建立時有兩個文件描述符,filedis[0]用於讀管道,filedis[1]用於寫管道。關閉管道,僅需將兩個文件描述符關閉即可。

創建無名管道pipe():

#include <unistd.h>

#include <stdio.h>

 

int main(){

        intpipe_filed[2];

        if(pipe(pipe_filed)<0){

                  printf("pipecreate failed.\n");

                  return-1;

        }

        else{

                  printf("pipecreate successfully.\n");

                  close(pipe_filed[0]);                            //關閉相應讀管道(必須要)

                  close(pipe_filed[1]);                            //關閉相應寫管道(必須要)

        }

}

注:fork()必須在pipe()之前來創建子進程,否則子進程無法進程相應的文件描述符,如果在fork之後,那麼fork會在子/父進程各執行一次,屬不同的管道。

讀寫無名管道示例:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/wait.h>

 

int main(){

        charcache[100];

        intfiledis[2];

        if(pipe(filedis)< 0){

                  printf("Createpipe failed.\n");

                  return-1;

        }

        memset(cache,0, sizeof(cache));            //在一段內存塊中填充某個特定的值,此為,對cache數組以0進行填充

 

        intpid;

        pid= fork();                                            // 創建子進程

        if(pid== 0){                                            //    進入子進程

                  printf("Inchild process.\n");

                  close(filedis[1]);                          //    關閉寫管道

                  sleep(3);                                        //    等待,為了等父進程寫入東西

                  read(filedis[0],cache, 100);    //    讀管道,並將內容寫入cache之中

                  printf("%s.\n",cache);              //    打印cache內容

                  close(filedis[0]);                          //    關閉讀管道

        }

        elseif(pid > 0){                            //    進入父進程

                  printf("Inparent process.\n");

                  close(filedis[0]);                          //    關閉讀管道

                  write(filedis[1],"Hello ",6);    //    第一次寫入

                  write(filedis[1],"linuxdba", 8);        //    第二次寫入

                  close(filedis[1]);                          //    關閉寫管道

                  wait(NULL);                                  //    等待子進程退出再往下執行

        }

        else{

                  printf("Createchild process failed.\n");

                  return-1;

        }

        return0;

}

Copyright © Linux教程網 All Rights Reserved