Linux进程间通信(一)管道

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

管道通信-特点
  1. 管道通讯是单向的,有固定的读端写端
  2. 数据被进程从管道读出后,在管道中该数据就不存在了。
  3. 当进程去读取空管道的时候,进程会阻塞。
  4. 当进程往满管道写入数据时,进程会阻塞。
  5. 管道容量为内核定义的(#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,管道)