linux pipe理解和父子进程

对于写管道:
    写入管道的数据按到达次序排列。如果管道满,则对管道的写被阻塞,直到管道的数据被读操作读取。对于写
操作,如果一次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("Sun");
        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

你可能感兴趣的:(linux,buffer,sun)