Linux 匿名管道

来源:互联网 发布:java调用scala 编辑:程序博客网 时间:2024/06/08 14:47





#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>int main(){int pipe_fd[2];if (pipe(pipe_fd) < 0)//pipe函数用于创建管道,如果小于0,失败{perror("pipe\n");//perror打印错误信息return 1;}pid_t id = fork();//创建子进程if (id < 0)//<0表明出错返回{perror("fork\n");return -1;}//子进程。创建子进程后,子进程返回0,父进程返回子进程idelse if (id == 0){close(pipe_fd[0]);//child关闭读--向匿名管道中写入数据const char* msg = "i am a child\n";int count = 5;int i = 0;while (1){write(pipe_fd[1], msg, strlen(msg));if (count-- == 0)break;sleep(1);printf("child: write data: %d\n", i++);}close(pipe_fd[1]);}else{//父进程从匿名管道中读数据close(pipe_fd[1]);//pipe_fd[1]为写数据--关闭写端char buf[1024];int count = 5;while (1){memset(buf, '\0', sizeof(buf));//每次进行初始化ssize_t _s = read(pipe_fd[0], buf, sizeof(buf)-1);//读数据if (_s > 0)//返回值大于0,读取成功,打印{printf("client ->server:%s\n", buf);}else if (_s == 0)//等于0,说明结束{printf("read pipe EOF...\n");}else//小于0 出错 直接退出循环break;}}close(pipe_fd[0]);int status = 0;pid_t ret = waitpid(id, &status, 0);//waitpid进程等待函数if (ret == id)//ret==id 说明等待成功{printf("wait child sucess...\n");printf("get sig:%d\n", status & 0xff);printf("exit code :%d\n", (status >> 8) & 0xff);}return 0;}




0 0