pipe管道簡單搭建
阿新 • • 發佈:2018-11-01
#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> int main(void) { int fd[2]; pid_t pid; char str[1024] = "helloworld"; char buf[1024]; //先建立管道,然後fork,建立子程序,即使子程序繼承管道 //pipe為單工模式,想要雙向通訊,可以建立兩個管道 if(pipe(fd)<0) { perror("pipe"); exit(1); } pid= fork(); //父寫子讀 //fd[0]讀端 //fd[1]寫端 if(pid>0) { //父程序關閉讀 close(fd[0]); sleep(2); write(fd[1],str, strlen(str)); close(fd[1]);//管道用完關閉 wait(NULL); } else if(pid ==0) { int len,flags; //子程序關閉寫 close(fd[1]); //改變檔案描述符為非阻塞模式 flags=fcntl(fd[0], F_GETFL); flags|=O_NONBLOCK; fcntl(fd[0], F_SETFL, flags); tryagain: len = read(fd[0], buf, sizeof(buf)); if(len==-1){ //讀到為空 if(errno==EAGAIN){ write(STDOUT_FILENO, "try again\n", 10); goto tryagain; } else{ perror("read"); close(fd[0]); exit(1); } } write(STDOUT_FILENO,buf, len); close(fd[0]);//管道用完關閉 } else { perror("fork"); exit(1); } return 0; }