在关于阻塞和非阻塞的名称管道的实现中,我对打开,读取和写入系统调用感到困惑。我感到困惑,这阻碍了这个过程。打开,读或写。
1.read.c示例代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
main()
{
int ret=0;
int fd=-1;
char buf[BUFSIZ]={0};
fd=open("fifo",O_RDONLY);
if(fd<0)
{
printf("\n mkfifo:%s",strerror(errno));
return;
}
printf("\nFile has open successfully");
while((ret=read(fd,buf,sizeof(buf)/sizeof(buf[0])))>0)
{
printf("\n%s",buf);
memset(buf,0,sizeof(buf)/sizeof(buf[0]));
}
exit(0);
}
2.write.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
main()
{
int ret=-2;
int fd=-1;
char buf[BUFSIZ]={0};
fd=open("fifo",O_WRONLY);
if(fd<0)
{
printf("\n mkfifo:%s",strerror(errno));
return;
}
printf("\nFile has open successfully");
printf("Enter Message:");
fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin);
ret=write(fd,buf,sizeof(buf)/sizeof(buf[0]));
memset(buf,0,sizeof(buf)/sizeof(buf[0]));
exit(0);
}
我也经历了这个链接
答案 0 :(得分:2)
如果未指定O_NDELAY
或O_NONBLOCK
,FIFO上的打开将一直阻塞,直到读者和作者都出现为止。
但是,例如,如果您将代码更改为:(在write.c中)
if ((fd=open("fifo", O_RDWR | O_NONBLOCK)) < 0)
{
perror("open");
return;
}
这将是无阻碍的