通信方式-有名管道的创建和读写

来源:互联网 发布:jdk和java区别 编辑:程序博客网 时间:2024/05/16 01:59
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>#if 1//创建两个FIFO实现不同进程间的全双工通信 --实现自由通信//有名管道的创建及读写extern int errno;//..............ser.c --服务端int main(){    if(access("write_fifo",F_OK) == -1)    {        int res = mkfifo("write_fifo",0666);        if(res == -1)        {            printf("errno = %d\n",errno);            perror("mkfifo");            exit(1);        }    } //printf("11111111111111111111111111\n");         //服务端先进行写的操作 ,再进行读的操作    int write_fd = open("write_fifo",O_WRONLY);  //以只写方式打开    if(write_fd == -1)    {        perror("open write_fifo");//打开写管道失败        exit(1);    }    int read_fd = open("read_fifo",O_RDONLY);    if(read_fd == -1)    {        perror("open read_fifo"); //打开读管道失败        //    unlink("read_fifo");        exit(1);    }    char sendbuf[256];    char recvbuf[256];    pid_t pid1,pid2;    int status;    pid1=fork();//创建进程    if(pid1 == -1)    {        printf("create fork error\n");        exit(1);    }    else if(pid1 == 0)//子进程    {        while(1)        {            read(read_fd,recvbuf,256);            printf("Cli:>%s\n",recvbuf);        }    }    else if(pid1>0)    {        pid2 = fork();        if(pid2 == -1)        {            printf("create fork2 erroe\n");            exit(1);        }        if(pid2 == 0)        {            while(1)            {                printf("Ser:>");                //if(read_fd == 0)                //    {                //        printf("\n");                //    }                // gets(sendbuf);                scanf("%s",sendbuf);                if(strcmp(sendbuf,"quit") == 0) //比较是否相等 相等就退出                {                    close(write_fd);//文件描述符                    unlink("write_fifo");//删除管道                    break;                }                write(write_fd,sendbuf,strlen(sendbuf)+1);            }        }        if(pid2 >0)        {            wait(&status);        }    }    /*while(1)   //只能实现你说一句我说一句      {      printf("Ser:>");      scanf("%s",sendbuf);      write(write_fd,sendbuf,strlen(sendbuf)+1);      read(read_fd,recvbuf,256);      printf("Cli:>%s\n",recvbuf);      }*/    return 0;}//.........cli.c --客户端int main(){    // 对文件是否存在以及文件权限进行检查,若不存在,进入access创建管道    if(access("read_fifo",F_OK) == -1)    {        int res = mkfifo("read_fifo",0666);        if(res == -1)        {            perror("mkfifo");            exit(1);        }    }        //客户端先进行读的操作 在进行写的操作    int read_fd = open("write_fifo", O_RDONLY);    if(read_fd == -1)    {        perror("open write_fifo");        exit(1);    }    int write_fd = open("read_fifo",O_WRONLY);    if(write_fd == -1)    {        perror("open read_fifo");        unlink("read_fifo");        exit(1);    }    int status;    char  sendbuf[256];    char  recvbuf[256];    pid_t pid1,pid2;    pid1=fork();    if(pid1 == -1)    {        printf("create fork error\n");        exit(1);    }        else   if(pid1 == 0)    {        while(1)        {            read(read_fd,recvbuf,256);            printf("Ser:>%s\n",recvbuf);        }    }    else if(pid1 >0)    {        pid2 = fork();        if(pid2 ==-1)        {            printf("create fork2 error\n");            exit(1);        }        else if(pid2 == 0)        {            while(1)            {                printf("Cli:>");                //        gets(sendbuf);                scanf("%s",sendbuf);                if(strcmp(sendbuf,"quit") == 0)                {                    close(write_fd);                    unlink("read_fifo");                    break;                }                write(write_fd,sendbuf,strlen(sendbuf)+1);            }           }        else if(pid2>0)        {            wait(&status);        }    }    /*       while(1)  //只能你说一句我说一句       {       read(read_fd,recvbuf,256);       printf("Ser:>%s\n",recvbuf);       printf("Cli:>");       scanf("%s",sendbuf);       write(write_fd,sendbuf,strlen(sendbuf)+1);       }*/    return  0;}#endif
原创粉丝点击