开发环境
VMware Workstation 15.5、Ubuntu 16.04.4
实现功能
通过无名管道从一个进程输出到另一个进程。
代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define buffer_size 1024//数组长度
int main()
{
int pipe_fd[2];//创建无名管道所使用的参数,0表示读、1代表写
pid_t pid;//作为fork函数返回值的中间变量
char buffer[buffer_size];
int len;
/***************************fork函数与pipe函数运行出错的情况**********************************/
if (pipe(pipe_fd) == -1)
{
perror("pipe");// 1)
exit(EXIT_FAILURE);// 2)
}
if ((pid = fork()) == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
/**************************************************************************************/
if (pid == 0)// 子进程读取管道
{
close(pipe_fd[1]); // 关闭写端
while ((len = read(pipe_fd[0], buffer, buffer_size)) > 0)// 3)
{
write(STDOUT_FILENO, buffer, len); // 输出到stdout// 4)
}
close(pipe_fd[0]); // 关闭读端
_exit(EXIT_SUCCESS);
}
else// 父进程写入管道
{
close(pipe_fd[0]); // 关闭读端
write(pipe_fd[1], "HELLOWORLD!\n", 14);
close(pipe_fd[1]); // 关闭写端
wait(NULL); // 等待子进程结束 5)
exit(EXIT_SUCCESS);
}
return 0;
}
代码说明
首先使用pipe函数创建了一个管道,然后使用fork函数创建了一个子进程。
子进程与父进程并行开始,父进程向管道的写端写入一条消息,子进程从管道的读端读入消息并输出。
双方存在进程竞争,但由于Wait函数,当关闭写端程序执行完,父进程将等待子程序结束才继续执行。
最后,两个进程分别关闭管道的读端和写端。
一些函数
1)perror
2)exit
3)read&write
4)wait
上面未补充函数将在后续给出