首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了。
一直在理解进程间通信的问题。发现上次忽略了一个问题,就是命名管道,命名管道和一般的管道有一些显著的不同:
1.FIFO是在文件系统中作为一个特殊的设备文件而存在的;
2.不同祖先的进程之间可以通过管道共享数据;
3.当共享管道的进程执行完所有的I/O操作后,FIFO将继续保存在文件系统中以便以后使用。
这里需要注意一下:管道只能由相关的进程使用,它们共同的祖先进程创建了管道,但是通过FIFO,不相关的进程也能交换数据。
FIFO的创建:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname,mode_t mode) ;
返回:若成功则为0,出错为-1;一旦已经mkfifo创建了一个FIFO,就可以open打开它。
当打开一个FIFO时,非阻塞标志会产生如下影响:
(1)一般情况,只读打开要阻塞到某个其它进程为写打开此FIFO。类似,为写打开一个FIFO要阻塞到某个其它进程为读而打开它。
(2)如果指定非阻塞状态,则只读打开立即返回,但是如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。
类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。
具体点代码如下:
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <errno.h> 4 #include <fcntl.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #define FIFO "/tmp/myfifo" 9 10 main(int argc,char** argv) 11 { 12 char buf_r[100]; 13 int fd; 14 int nread; 15 16 if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)) 17 printf("cannot create fifoserver\n"); 18 printf("Preparing for reading bytes...\n"); 19 20 memset(buf_r,0,sizeof(buf_r)); 21 fd=open(FIFO,O_RDONLY|O_NONBLOCK,0); 22 if(fd==-1) 23 { 24 perror("open"); 25 exit(1); 26 } 27 while(1) 28 { 29 memset(buf_r,0,sizeof(buf_r)); 30 31 if((nread=read(fd,buf_r,100))==-1){ 32 if(errno==EAGAIN) 33 printf("no data yet\n"); 34 } 35 printf("read %s from FIFO\n",buf_r); 36 sleep(1); 37 } 38 pause(); 39 unlink(FIFO); 40 }
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <errno.h> 4 #include <fcntl.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #define FIFO_SERVER "/tmp/myfifo" 9 10 main(int argc,char** argv) 11 { 12 int fd; 13 char w_buf[100]; 14 int nwrite; 15 16 if(fd==-1) 17 if(errno==ENXIO) 18 printf("open error; no reading process\n"); 19 fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0); 20 if(argc==1) 21 printf("Please send something\n"); 22 strcpy(w_buf,argv[1]); 23 if((nwrite=write(fd,w_buf,100))==-1) 24 { 25 if(errno==EAGAIN) 26 printf("The FIFO has not been read yet.Please try later\n"); 27 } 28 else 29 printf("write %s to the FIFO\n",w_buf); 30 }