美文网首页
两终端自由对话

两终端自由对话

作者: b6aed1af4328 | 来源:发表于2016-12-03 20:13 被阅读17次

    献给忍哥。
    星期四做了通过文件读写实现终端(进程)间的对话,忍哥说好蠢,你说一句我说一句很死板,就不能一个人突然说很多句,自由对话么?课后想了想,实现了这一功能。
    通过2文件读写,myfifo记录bro1的话,myfifo1记录bro2的话,2个终端2个程序,程序fork出一个父进程和一个子进程,父进程负责一个文件的写,子进程负责另一文件的读,
    写成死循环,sleep(1)1秒刷新一次。
    lei141.cc

    #include<sys/types.h>
    #include<sys/stat.h>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<unistd.h>//用vim打开管道文件 无法操作
    #include<errno.h>
    #include<fcntl.h>
    
    
    int main()
    {
        int ret=-1;
        ret=mkfifo("/home/lifulin/Pictures/myfifo",0777);
        if(-1==ret)
        {
            if(EEXIST!=errno)
            {
                perror("mkfifo");
                exit(EXIT_FAILURE);
            }
            else 
            {
                printf("myfifo exist\n");
            }
    
        }
        ret=mkfifo("/home/lifulin/Pictures/myfifo1",0777);
        if(-1==ret)
        {
            if(EEXIST!=errno)
            {
                perror("mkfifo");
                exit(EXIT_FAILURE);
            }
            else 
            {
                printf("myfifo1 exist\n");
            }
    
        }
        printf("fifo is ok\n");
        pid_t pid=-1;
        pid=fork();
        if(pid>0)
        {
            int fd=-1;
            fd=open("/home/lifulin/Pictures/myfifo",O_RDWR);
           int judge=1;
           while(1)
             {
                 sleep(1);
                     char caBuf[32]={'\0'};
                   ret=read(fd,caBuf,sizeof(caBuf));
                       if(ret>0)
                      {
                      
    
                        printf("bro1:%s\n",caBuf);
                      }
                     if(ret==0)
                     {
                         printf("\n");
                     }
             }
             close(fd);
        }
        if(pid==0)
        {
                int ret=-1;
             int fd=-1;
              fd=open("/home/lifulin/Pictures/myfifo1",O_RDWR);
                  int judge=1;
       while(1)
         {    
                sleep(1);
               char test[32]={"11"};
                 char caBuf[32]={'\0'};
                  scanf("%s",caBuf);
                  ret=write(fd,caBuf,sizeof(caBuf));//只有一端打开,是不写不读的。
                  if(ret>0)
                      {
    
                          }
                      if(ret==-1)
                      {
                     printf("写入失败\n");
                         return 0;
                     }
    
           } 
           close(fd);
        }
        if(pid==-1)
        {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        return 0;
    }
    

    lei142.cc

    #include<sys/types.h>
    #include<sys/stat.h>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<unistd.h>//用vim打开管道文件 无法操作
    #include<errno.h>
    #include<fcntl.h>
    
    
    int main()
    {
        pid_t pid=-1;
        pid=fork();
        if(pid>0)
        {
            int ret=-1;
            int fd=-1;
             fd=open("/home/lifulin/Pictures/myfifo",O_RDWR);
                int judge=1;
           while(1)
             {
                    sleep(1);
                   char test[32]={"11"};
                     char caBuf[32]={'\0'};
               scanf("%s",caBuf);
                  ret=write(fd,caBuf,sizeof(caBuf));//只有一端打开,是不写不读的。
                  if(ret>0)
                      {
                          }
                      if(ret==-1)
                      {
                     printf("写入失败\n");
                         return 0;
                     }
           } 
        }
        if(pid==0)
        {
             int fd=-1;
             int ret=-1;
            fd=open("/home/lifulin/Pictures/myfifo1",O_RDWR);
           int judge=1;
           while(1)
             {
                 sleep(1);
                     char caBuf[32]={'\0'};
                   ret=read(fd,caBuf,sizeof(caBuf));
                       if(ret>0)
                      {
                      
    
                        printf("bro2:%s\n",caBuf);
                      }
                     if(ret==0)
                     {
                         printf("\n");
                     }
             }
             close(fd);
        }
        if(pid==-1)
        {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        return 0;
    }
    

    lei141.cc和lei142.cc在不同终端下运行,注意文件路径的修改。

    相关文章

      网友评论

          本文标题:两终端自由对话

          本文链接:https://www.haomeiwen.com/subject/odvcmttx.html