- 论坛徽章:
- 0
|
最近看了进程间通信中的有名管道通信方式。以下是网上看的一个有名管道的示例程序:
读进程:
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FIFO "/tmp/myfifo"
main(int argc,char** argv)
{
char buf_r[100];
int fd;
int nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
printf("cannot create fifoserver\n");
printf("Preparing for reading bytes....\n");
memset(buf_r,0,sizeof(buf_r));
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
{
perror("open");
exit(1);
}
while(1){
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){
if(errno==EAGAIN)
printf("no data yet\n");
}
printf("read %s from FIFO\n",buf_r);
sleep(1);
}
pause();
unlink(FIFO);
}
写进程:
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FIFO_SERVER "/tmp/myfifo"
main(int argc,char** argv)
{
int fd;
char w_buf[100];
int nwrite;
if(fd==-1)
if(errno==ENXIO)
printf("open error;no reading process\n");
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
if(argc==1)
printf("Please send something\n");
strcpy(w_buf,argv[1]);
if((nwrite=write(fd,w_buf,100))==-1)
{
if(errno==EAGAIN)
printf("The FIFO has not been read yet. Please try later\n");
}
else
printf("write %s to the FIFO\n",w_buf);
}
程序大致看明白了,但是还有一些小的疑问,希望有高手可以请教
问题1:
程序中红色字体部分是什么意思?是不是说,管道通信中,在写数据之前,要保证上一次写的数据已经被读进程给读出去了。如果上一次写的数据还没有被读出去,就会出现红色字体显示的错误?
问题2:
程序中绿色字体部分,用的是while(1)的循环,这不是死循环吗,程序中能这样吗?那读进程什么时候才能终止啊?
问题3:
程序中紫色字体部分,pause函数阻塞读进程,那它等待的是什么信号呢?写进程中没有给读进程发送信号啊?
|
|