进程间通信——管道

1、管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。

2、管道的分类:

有名管道 无名管道
mkfifo/mkfifo() pipe()
半双工 半双工
数据在内存 数据在内存
任意两个进程间通信

只能在父子进程间通信

3、管道实现:

管道有固定的读端和写端,管道为空,读read会阻塞;管道为满,写write会阻塞;

操作管道时,要求读端和写端必须都存在;

写端关闭,读read(),直接返回0;

读端关闭,写write() ,产生异常,收到SIGPIPE信号。

 4、代码中实现一些管道的做法

三个文件模拟(a.c  b.c  pipe)

a.c(写端):

#include
#include
#include
#include
#include
#include
#include

void Fun(int sig)
{
	printf("sig=%d\n", sig);
}

int main()
{
	signal(SIGPIPE, Fun);
	int fdw = open("fifo", O_WRONLY);
	printf("fdw=%d\n", fdw);
	printf("input:\n");

	while (1)
	{
		char buff[128] = { 0 };
		fgets(buff, 128, stdin);

		if (strncmp(buff, "end", 3) == 0)
		{
			break;
		}

		write(fdw, buff, strlen(buff));
	}

	close(fdw);

	exit(0);
}

b.c(读端):

#include
#include
#include
#include
#include
#include


int main()
{
	int fdr = open("fifo", O_RDONLY);
	printf("fdr=%d\n", fdr);

	while (1)
	{
		char buff[128] = { 0 };

		if (read(fdr, buff, 127) == 0)
		{
			break;
		}

		printf("buff=%s\n", buff);
	}

	close(fdr);

	exit(0);
}

pipe(管道文件):

#include
#include
#include
#include
#include
#include


int main()
{
	int fd[2];

	pipe(fd);

	pid_t pid = fork();

	if (pid == 0)
	{
		close(fd[1]);
		while (1)
		{
			char buff[128] = { 0 };
			if (read(fd[0], buff, 127) == 0)
			{
				break;
			}
			printf("buff=%s\n", buff);
		}
		close(fd[0]);
	}
	else
	{
		close(fd[0]);
		while (1)
		{
			char buff[128] = { 0 };
			fgets(buff, 128, stdin);
			if (strncmp(buff, "end", 3) == 0)
			{
				break;
			}

			write(fd[1], buff, strlen(buff));
		}
		close(fd[1]);
	}

	exit(0);
}

 

你可能感兴趣的:(C语言,Linux)