对于写管道:
写入管道的数据按到达次序排列。如果管道满,则对管道的写被阻塞,直到管道的数据被读操作读取。对于写
操作,如果一次write调用写的数据量小于管道容量,则写必须一次完成,即如果管道所剩余的容量不够,write被阻塞直到管道的剩余容量可以一次写完
为止。如果write调用写的数据量大于管道容量,则写操作分多次完成。如果用fcntl设置管道写端口为非阻塞方式,则管道满不会阻塞写,而只是对写返
回0。
对于读管道:
读操作按数据到达的顺序读取数据。已经被读取的数据在管道内不再存在,这意味着数据在管道中
不能重复利用。如果管道为空,且管道的写端口是打开状态,则读操作被阻塞直到有数据写入为止。一次read调用,如果管道中的数据量不够read指定的数
量,则按实际的数量读取,并对read返回实际数量值。如果读端口使用fcntl设置了非阻塞方式,则当管道为空时,read调用返回0。
对于管道的关闭:
如果管道的读端口关闭,那么在该管道上的发出写操作调用的进程将接收到一个SIGPIPE信号。关闭写端口是给读端口一个文件结束符的唯一方法。对
于写端口关闭后,在该管道上的read调用将返回0。下面再来看看,系统调用pipe的例子。在下面的例子中,父进程通过管道向子进程发送了一个字符串。
子进程将它显示出来:
1.创建pipe文件
#inlcude
int fd[2];
if ( pipe(fd) != 0 )
2.读fd[0]
close(fd[1]);
read(fd[0], buffer, BUF_SIZ);
3.写fd[1]
close(fd[0]);
write(fd[1], buffer, strlen(buffer));
4.给个可以运行的代码
#include unistd.h>
int main(void){
int fd[2];
char buf[256];
pid_t pid;
if(pipe(fd) != 0){
puts("Pipe No!");
}
else{
puts("Pipe ok!");
}
if((pid=fork()) == 0){
puts("Son");
close(fd[0]);
char str[]="Jack";
write(fd[1], str, sizeof(str));
}
else{
puts("Father");
close(fd[1]);
read(fd[0], buf, sizeof(buf));
puts(buf);
}
return 0;
}
运行结果是
Pipe ok!
Father
Sun
Jack
1. fork()后 创建了子进程,此时父子进程拥有同样的程序,子进程中pid==0,父进程中pid为子进程的进程ID。
2. pipe只有当里面有内容时才能被read,故两个进程之间要先write后read
阅读(842) | 评论(0) | 转发(0) |