Chinaunix首页 | 论坛 | 博客
  • 博客访问: 520952
  • 博文数量: 257
  • 博客积分: 1666
  • 博客等级: 上尉
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-02 23:02
文章分类

全部博文(257)

文章存档

2013年(2)

2012年(255)

分类:

2012-09-13 12:57:07

今天回顾一下有名管道,自己写了一个聊天的程序,其代码如下所示:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<fcntl.h>
  6. #include<string.h>
  7. #include<stdlib.h>
  8. #define FIFO_READ "fiforead"
  9. #define FIFO_WRITE "fifowrite"
  10. #define MASIZE 1024
  11. int main(){
  12.     int rfd,wfd;
  13.     char buf[1024];
  14.     umask(0);
  15.     if(mkfifo(FIFO_WRITE,S_IFIFO|0666)){
  16.         perror("mkfifo");
  17.         exit(1);
  18.     }
  19.     umask(0);
  20.    /* while((rfd=open(FIFO_READ,O_RDONLY))==-1){
  21.      sleep(1);
  22.     }*/
  23.     wfd=open(FIFO_WRITE,O_WRONLY);
  24.     if(wfd==-1){
  25.         perror("open");
  26.         exit(0);
  27.     }
  28.    while((rfd=open(FIFO_READ,O_RDONLY))==-1){
  29.          sleep(1);
  30.     }
  31.     while(1){
  32.         printf("service: ");
  33.         scanf("%s",buf);
  34.         write(wfd,buf,strlen(buf));
  35.         printf("client:");
  36.         if(read(rfd,buf,1024)<0){
  37.             perror("read");
  38.             exit(1);
  39.         }
  40.         printf("%s\n",buf);
  41.         if(strcmp(buf,"exit")==0){
  42.             exit(0);
  43.         }
  44.     }
  45. }
上面的注释部分是我自己写的。
在一个客户端的聊天程序如下所示:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<sys/types.h>
  4. #include<stdlib.h>
  5. #include<sys/stat.h>
  6. #include<fcntl.h>
  7. #include<string.h>
  8. #define FIFO_READ "fifowrite"
  9. #define FIFO_WRITE "fiforead"
  10. #define MASIZE 1024
  11. int main(){
  12.     int rfd,wfd;
  13.     char buf[1024];
  14.     umask(0);
  15.     if(mkfifo(FIFO_WRITE,S_IFIFO|0666)){
  16.         perror("mkfifo");
  17.         exit(1);
  18.     }
  19.     while((rfd=open(FIFO_READ,O_RDONLY))==-1){
  20.      sleep(1);
  21.     }

  22.     wfd=open(FIFO_WRITE,O_WRONLY);
  23.     if(wfd==-1){
  24.         perror("open");
  25.         exit(1);
  26.     }
  27.     //wfd=open(FIFO_WRITE,O_WRONLY);
  28.     /*while((rfd=open(FIFO_READ,O_RDONLY))==-1){
  29.         sleep(1);
  30.     }*/
  31.     while(1){
  32.         printf("client: ");
  33.         if(read(rfd,buf,1024)<0){
  34.             perror("read");
  35.             exit(1);
  36.         }
  37.         if(strcmp(buf,"exit")==0){
  38.             exit(0);
  39.         }
  40.         printf("service:");
  41.         scanf("%s",buf);
  42.         write(wfd,buf,strlen(buf));
  43.     
  44.         
  45.     }
  46. }
其实这两个程序基本上一样,就是换个名管道名而已。
刚开始程序就死那儿了,不动,当时我就纳闷了,开始还以为是自己没有给新创建的管道屏蔽所有的权限,于是就把权限给加了,结果还是不行,看看书上怎么写的,书上的就是上面的,而我就是把注释行的部分放在了上面,其实也不是下面上面的问题,可是我当时纳闷怎么就反了一下就不行呢?
翻了一下其他资料看了一下才恍然大悟了!
在读写有名管道之前需要用open函数打开该有名管道,打开有名管道操作与其他文件有一定的区别,如果希望打开管道的写端,则需要另一个进程打开该管道的读端,如果只打开有名管道的一端,则系统将暂时阻塞打开进程,知道另一个进程打开管道的另一端,当前进程才会继s续执行,因此,在使用有名管道时一定么使用两个进程分别打开其读端和写端!
现在知道程序死的原因了吧!

阅读(1420) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~