2
我有關於打開,讀寫系統調用在實現名稱管道關於阻塞和非阻塞的困惑。我感到困惑,它阻止了這個過程。打開,讀或寫。在命名管道打開系統的情況下是阻塞調用還是讀寫?
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);
}
我已經通過這個環節去也
How to block the read system call
我們不應該打開的管道或FIFO中O_RDWR模式。因爲它們本質上都是單向的。所以如果我們在O_RDWR模式下打開它,那麼行爲將是不確定的。是的,你是正確的系統調用將阻止進程。在這種情況下,我們應該有讀寫器代碼。意思是如果你已經在O_RDONLy中打開了fifo我們必須打開文件O_WRONLY。 – Rajdhar