day6 进程通信

本文详细描述了如何在C语言中通过mkfifo()创建有名管道,以及使用fork()函数创建父子进程进行双向通信。主要涉及写端和读端操作,包括数据的读写和接收,直到接收到quit命令退出。
摘要由CSDN通过智能技术生成

create.c

  1 #include<head.h>
  2 
  3 int main(int argc, const char *argv[])
  4 {
  5     //创建有名管道文件
  6     if(mkfifo("./myfifo", 0664) != 0)
  7     {
  8         perror("mkfifo error");
  9         return -1;
 10     }
 11     printf("myfifo create success\n");
 12     if(mkfifo("./myfifo1", 0664) != 0)
 13     {
 14         perror("mkfifo1 error");
 15         return -1;
 16     }
 17     printf("myfifo create success\n");
 18     printf("myfifo1 create success\n");                                                                                                  
 19 
 20         //使用getchar阻塞一下
 21     getchar();
 22 
 23     system("rm myfifo");
 24     system("rm myfifo1");
 25 
 26 
 27 
 28     return 0;
 29 }
~                                                                                                                                            
~                 

snd.c

  1 #include<head.h>
  2 
  3 int main(int argc, const char *argv[])
  4 {
  5 
  6 
  7 
  8 pid_t pid = -1;   //定义变量存储进程号
  9 
 10     pid = fork();    //创建一个子进程
 11 
 12     //后续的程序,父子进程都会执行
 13     if(pid > 0)
 14     {//以只写的形式打开管道文件
 15     int wfd = -1;
 16     if((wfd = open("./myfifo", O_WRONLY)) == -1)
 17     {
 18         perror("open error");
 19         return -1;
 20     }
 21 
 22     printf("写端打开成功\n");
 23 
 24     //向管道文件中循环写入数据
 25     char wbuf[128] = "";
 26     while(1)
 27     {
 28         bzero(wbuf, sizeof(wbuf));           //清空内容
 29 
 30         //从终端输入数据
 31         printf("请输入>>>>>");
 32         fflush(stdout);            //刷新行缓冲区
 33         read(0, wbuf, sizeof(wbuf));
 34         wbuf[strlen(wbuf)-1] = 0;           //将回车换成'\0'
 35 
 36         //将数据写入管道中
 37         write(wfd, wbuf, sizeof(wbuf));
 38 
 39         //判断
 40         if(strcmp(wbuf, "quit") == 0)
 41         {
 42             break;
 43         }                                                                                                                                                                                                                                                                                                          
 44     }
 45 
 46     //关闭文件
 47     close(wfd);
 48 
 49 
 50 
 51     }else if(pid == 0)
 52     {//以只写读的形式打开管道文件
 53     int rfd = -1;
 54     if((rfd = open("./myfifo1", O_RDONLY)) == -1)
 55     {
 56         perror("open error");
 57         return -1;
 58     }
 59 
 60     printf("读端打开成功\n");
 61 
 62     //从管道文件中循环读取数据
 63     char rbuf[128] = "";
 64     while(1)
 65     {
 66         bzero(rbuf, sizeof(rbuf));           //清空内容
 67 
 68         //从管道中读取数据
 69         read(rfd, rbuf, sizeof(rbuf));
 70 
 71         printf("收到消息:%s\n", rbuf);
 72 
 73 
 74         //判断
 75         if(strcmp(rbuf, "quit") == 0)
 76         {
 77             break;
 78         }
 79     }
 80 
 81     //关闭文件
 82     close(rfd);
 83 
 84 
 85     }else
 86     {
 87         perror("fork error");
 88         return -1;
 89     }
 90     return 0;
 91 }
~                                                                                                                                                                                                                                                                                                                      
~                             

    recv.c

  1 #include<head.h>
  2 
  3 int main(int argc, const char *argv[])
  4 {
  5 
  6 
  7 
  8 pid_t pid = -1;   //定义变量存储进程号
  9 
 10     pid = fork();    //创建一个子进程
 11 
 12     //后续的程序,父子进程都会执行
 13     if(pid > 0)
 14     { //以只写读的形式打开管道文件
 15     int rfd = -1;
 16     if((rfd = open("./myfifo", O_RDONLY)) == -1)
 17     {
 18         perror("open error");
 19         return -1;
 20     }
 21 
 22     printf("读端打开成功\n");
 23 
 24     //从管道文件中循环读取数据
 25     char rbuf[128] = "";
 26     while(1)
 27     {
 28         bzero(rbuf, sizeof(rbuf));           //清空内容
 29 
 30         //从管道中读取数据
 31         read(rfd, rbuf, sizeof(rbuf));
 32 
 33         printf("收到消息:%s\n", rbuf);
 34 
 35 
 36         //判断
 37         if(strcmp(rbuf, "quit") == 0)
 38         {
 39             break;
 40         }
 41     }
 42 
 43     //关闭文件
 44     close(rfd);
 45 
 46 
 47     }else if(pid == 0)
 48     {//以只写的形式打开管道文件
 49     int wfd = -1;
 50     if((wfd = open("./myfifo1", O_WRONLY)) == -1)
 51     {
 52         perror("open error");
 53         return -1;
 54     }
 55 
 56     printf("写端打开成功\n");
 57 
 58     //向管道文件中循环写入数据
 59     char wbuf[128] = "";
 60     while(1)
 61     {
 62         bzero(wbuf, sizeof(wbuf));           //清空内容
 63 
 64         //从终端输入数据
 65         printf("请输入>>>>>");
 66         fflush(stdout);            //刷新行缓冲区
 67         read(0, wbuf, sizeof(wbuf));
 68         wbuf[strlen(wbuf)-1] = 0;           //将回车换成'\0'
 69 
 70         //将数据写入管道中
 71         write(wfd, wbuf, sizeof(wbuf));
 72 
 73         //判断
 74         if(strcmp(wbuf, "quit") == 0)
 75         {
 76             break;
 77         }
 78     }
 79 
 80     //关闭文件
 81     close(wfd);
 82 
 83                                                                                                                                                                                                                                                                                                                    
 84     }else
 85     {
 86         perror("fork error");
 87         return -1;
 88     }
 89     return 0;
 90 }


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值