今天回顾一下有名管道,自己写了一个聊天的程序,其代码如下所示:
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<string.h>
- #include<stdlib.h>
- #define FIFO_READ "fiforead"
- #define FIFO_WRITE "fifowrite"
- #define MASIZE 1024
- int main(){
- int rfd,wfd;
- char buf[1024];
- umask(0);
- if(mkfifo(FIFO_WRITE,S_IFIFO|0666)){
- perror("mkfifo");
- exit(1);
- }
- umask(0);
- /* while((rfd=open(FIFO_READ,O_RDONLY))==-1){
- sleep(1);
- }*/
- wfd=open(FIFO_WRITE,O_WRONLY);
- if(wfd==-1){
- perror("open");
- exit(0);
- }
- while((rfd=open(FIFO_READ,O_RDONLY))==-1){
- sleep(1);
- }
- while(1){
- printf("service: ");
- scanf("%s",buf);
- write(wfd,buf,strlen(buf));
- printf("client:");
- if(read(rfd,buf,1024)<0){
- perror("read");
- exit(1);
- }
- printf("%s\n",buf);
- if(strcmp(buf,"exit")==0){
- exit(0);
- }
- }
- }
上面的注释部分是我自己写的。
在一个客户端的聊天程序如下所示:
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<stdlib.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<string.h>
- #define FIFO_READ "fifowrite"
- #define FIFO_WRITE "fiforead"
- #define MASIZE 1024
- int main(){
- int rfd,wfd;
- char buf[1024];
- umask(0);
- if(mkfifo(FIFO_WRITE,S_IFIFO|0666)){
- perror("mkfifo");
- exit(1);
- }
- while((rfd=open(FIFO_READ,O_RDONLY))==-1){
- sleep(1);
- }
- wfd=open(FIFO_WRITE,O_WRONLY);
- if(wfd==-1){
- perror("open");
- exit(1);
- }
- //wfd=open(FIFO_WRITE,O_WRONLY);
- /*while((rfd=open(FIFO_READ,O_RDONLY))==-1){
- sleep(1);
- }*/
- while(1){
- printf("client: ");
- if(read(rfd,buf,1024)<0){
- perror("read");
- exit(1);
- }
- if(strcmp(buf,"exit")==0){
- exit(0);
- }
- printf("service:");
- scanf("%s",buf);
- write(wfd,buf,strlen(buf));
-
-
- }
- }
其实这两个程序基本上一样,就是换个名管道名而已。
刚开始程序就死那儿了,不动,当时我就纳闷了,开始还以为是自己没有给新创建的管道屏蔽所有的权限,于是就把权限给加了,结果还是不行,看看书上怎么写的,书上的就是上面的,而我就是把注释行的部分放在了上面,其实也不是下面上面的问题,可是我当时纳闷怎么就反了一下就不行呢?
翻了一下其他资料看了一下才恍然大悟了!
在读写有名管道之前需要用open函数打开该有名管道,打开有名管道操作与其他文件有一定的区别,如果希望打开管道的写端,则需要另一个进程打开该管道的读端,如果只打开有名管道的一端,则系统将暂时阻塞打开进程,知道另一个进程打开管道的另一端,当前进程才会继s续执行,因此,在使用有名管道时一定么使用两个进程分别打开其读端和写端!
现在知道程序死的原因了吧!
阅读(1420) | 评论(0) | 转发(0) |