您的位置:首页 > 运维架构 > Linux

Linux进程间通信(一)管道

2016-01-31 14:25 633 查看
一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。
管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。

管道通信-特点

管道通讯是单向的,有固定的读端和写端。
数据被进程从管道读出后,在管道中该数据就不存在了。
当进程去读取空管道的时候,进程会阻塞。
当进程往满管道写入数据时,进程会阻塞。
管道容量为内核定义的(#define PIPE_BUFFER include/linux/pipe_fs_i.h)

无名管道
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件,因此可以使用read,write,close等函数来访问无名管道。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
pid_t pid;
int pipefd[2];
char buf;

if(argc != 2)
{
fprintf(stderr,"Usage: %s <string>\n",argv[0]);
exit(EXIT_FAILURE);
}
if(pipe(pipefd) == -1) //pipe需要在fork前调用
{
perror("pipe error");
exit(EXIT_FAILURE);
}

if((pid = fork()) < 0)
{
perror("fork error");
exit(EXIT_FAILURE);
}
else if(pid == 0) /* child reads from pipe */
{
close(pipefd[1]); /* close unused write end */

while(read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);

write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
}
else /* parent writes argv[1] to pipe */
{
close(pipefd[0]); /* close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]);
waitpid(pid,NULL,0);
exit(EXIT_SUCCESS);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 管道