Linux管道pipe从入门到进阶

Linux管道pipe从入门到进阶 管道基础piep创建管道且只能由一方当写端另一方当读端。这里一定要注意read函数需要读取到数据结尾所以用sizeof会把字符串后的\0也读进去读的是字节数但strlen读取的是字符串长度不会读取\0管道实现原理内核借助环形队列机制使用内核缓冲区实现特质 1.伪文件2.滚到中的数据只能读取一次。3.数据在管道中只能单向流动局限性1.自己写不能自己读。2.数据不可反复读。3.半双工通讯4.血缘关系进程间通讯这是管道的简化模型我们在使用的时候一定要保证输入和输出在管道内是单向的加dup2加exec配合输出指令pipedup2execlp再次代码中同时呈现主要执行ls | wc -ldup2把原本的标准输出重定向到了管道接口通过将进程的输入输出与管道建立联系实现父子进程execlp的联合sys_error是定义的函数这段代码是在演示一个管道pipe让两个子进程向父进程传递数据。核心目的创建两个子进程分别向管道写入 “1.hello\n” 和 “2.world\n”父进程从管道读取并打印。多个子进程输入父进程输出#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/wait.hintmain(){intfd[2];intret;charbuf[1024];retpipe(fd);pid_tpid;inti;for(i0;i2;i){pidfork();if(pid0){break;}elseif(pid-1){perror(fork error);exit(1);}}if(i0){close(fd[0]);write(fd[1],1.hello,dlz\n,strlen(1.hello,dlz\n));close(fd[1]);}elseif(i1){close(fd[0]);write(fd[1],2.wd,dlz\n,strlen(2.wd,dlz\n));close(fd[1]);}elseif(i2){close(fd[1]);while((retread(fd[0],buf,sizeof(buf)))0){write(STDOUT_FILENO,buf,ret);}write(STDOUT_FILENO,buf,ret);for(intj0;j2;j){wait(NULL);}}return0;}利用i去区分子进程1子进程2父进程父进程需要wait两个子进程且注意多个子进程输入时需要多次输出利用for循环检测ret是否0直到输出结束。