在Linux下对管道的操作主要集中于阻塞和非阻塞两种情况下,在这两种情况下的主要区别在于写的情况下,主要区别为:
无论是在阻塞还是非阻塞情况下,read操作总是要先于write 操作之前打开,否则,容易产生错误:No such device or address。
写操作,在阻塞情况下,如果缓冲区空间不存在的话,则会阻塞在write操作中;在非阻塞情况下,如果缓冲区中不存在空间的话,则直接返回错误,EAGAIN(Resource temporarily unavailable);
读操作,在阻塞情况下,如果缓冲区不存在数据的话,则会阻塞在read操作中;在非阻塞情况下,如果缓冲中不存在数据的话,则会直接返回数据长度为0。
附:测试代码;
void sigfuc(int nsig)
{
printf("sigfunc/n");
}
int main(int argc,char** argv)
{
signal(SIGPIPE,sigfuc);
int nfd = -1;
if((nfd = open("pipe",O_WRONLY|O_NONBLOCK)) == -1){
if(errno == ENODEV){
printf("ENOENT/n");
}
printf("%s/n",strerror(errno));
return -1;
}
char szbuf[30]={0};
while (1){
sprintf(szbuf,"----%d/n",time(NULL));
if (write(nfd,szbuf,strlen(szbuf)) < 0)
{
printf("%s/n",strerror(errno));
if (errno == EAGAIN){
printf("No Data Receive./n");
}
printf("read error.../n");
}
else
{
printf("%s/n",szbuf);
}
printf("%s/n",strerror(errno));
}
printf("end/n");
close(nfd);
return 0;
}
int main(int argc,char** argv) { unlink("pipe"); if(mkfifo("pipe",O_CREAT |O_NONBLOCK | O_RDWR| 0666) == -1){ printf("%s/n",strerror(errno)); return -1; } int nfd = -1; if((nfd = open("pipe",O_RDONLY)) == -1){ printf("%s/n",strerror(errno)); return -1; } char szbuf[30]={0}; while (1){ if (read(nfd,szbuf,30) < 0) { if (errno == EAGAIN){ printf("No Data Receive./n"); } printf("read error.../n"); } else { printf("%s/n",szbuf); sleep(5); } printf("1234567890=%s/n",strerror(errno)); } printf("end/n"); close(nfd); return 0; }