两终端自由对话

2016-12-03  本文已影响17人  b6aed1af4328

献给忍哥。
星期四做了通过文件读写实现终端(进程)间的对话,忍哥说好蠢,你说一句我说一句很死板,就不能一个人突然说很多句,自由对话么?课后想了想,实现了这一功能。
通过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在不同终端下运行,注意文件路径的修改。

上一篇 下一篇

猜你喜欢

热点阅读