2014-01-28 53 views
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

回答

2

如果O_NDELAYO_NONBLOCK沒有被指定,在FIFO上打開阻止unt一位讀者和一位作家都在場。

但是,如果你改變你的代碼爲例:(在爲write.c)

if ((fd=open("fifo", O_RDWR | O_NONBLOCK)) < 0) 
    { 
     perror("open"); 
     return; 
    } 

這將非阻塞

more info

+0

我們不應該打開的管道或FIFO中O_RDWR模式。因爲它們本質上都是單向的。所以如果我們在O_RDWR模式下打開它,那麼行爲將是不確定的。是的,你是正確的系統調用將阻止進程。在這種情況下,我們應該有讀寫器代碼。意思是如果你已經在O_RDONLy中打開了fifo我們必須打開文件O_WRONLY。 – Rajdhar

相關問題