使用无名管道完成两进程间单项通信

使用无名管道完成进程通信

头文件

首先我们要选择需要使用的头文件:
#include 基础头文件
#include 字符串操作头文件
#include 进程操作的头文件

  #include 
  #include 
  #include 

打开无名管道

进入主函数我们需要先打开无名管道,如果失败则返回失败信息。

int main()
  6 {
  7     int pipefd[2] = {};
  8     //打开无名管道
  9     if(pipe(pipefd))
 10     {
 11         perror("pipe");
 12         return -1;
 13     }

创建父子进程

然后就是创建进程,无名管道只能在父子进程间单项通信,所以需要用到void fork(void)函数创建父子进程,返回值为1则是父进程,0则是子进程。以下创建父子进程并且记录返回值。

		//创建进程
 16     pid_t id = fork();


父进程发送操作

上面用fork函数创建了父子进程,然后运用if else语句来区分父进程与子进程。首先进入的是父进程,这里先用sleep函数使进程休眠一秒,以便于后面显示时与子进程分开,然后关闭读操作,然后用一个循环不断写入要发送的消息到管道中,当输入quit时则通信结束。

 if(id)
 19     {
 20         //父进程写
 21         sleep(1);
 22         //关闭读
 23         close(pipefd[0]);
 24         char buf[1024] = {};
 25         printf("我是父进程%u,我要和子进程通信%u\n",getpid(),id);
 26         for(;;)
 27         {
 28             printf(">");
 29             gets(buf);
 30             write(pipefd[1],buf,strlen(buf)+1);
 31             if(0 == strcmp("quit",buf))
 32             {
 33                 printf("父进程通信结束!\n");
 34                 close(pipefd[1]);
 35                 return 0;
 36             }
 37         }
 38     }

子进程接收消息操作

上面运用if else语句区分开父进程与子进程,else里面则是子进程操作,首先先关闭写操作,然后定义一个字符数组不断获取无名管道中的消息并且打印出来,当接收到quit时则通信结束。

 else
 40     {
 41         //子进程读
 42         //关闭写
 43         close(pipefd[1]);
 44         char buf[1024] = {};
 45         printf("我是子进程%u,我要和父进程通信%u\n",getpid(),getppid());
 46         for(;;)
 47         {
 48             read(pipefd[0],buf,sizeof(buf));
 49             printf("read:%s\n",buf);
 50             if(0 == strcmp("quit",buf))
 51             {
 52                 printf("子进程通信结束!\n");
 53                 close(pipefd[0]);
 54                 return 0;
 55             }
 56         }
 57 
 58     }
 59 
 60 }

运行结果

以下则是程序运行结果,由于父子进程之间打印可能有些冲突,但总体并不影响。

使用无名管道完成两进程间单项通信_第1张图片

你可能感兴趣的:(Linux操作系统,Linux,无名管道,父进程子进程,进程间通信,区分父子进程)