`
icarusliu
  • 浏览: 232154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C半双工管道

阅读更多

父进程不断发送消息到子进程,子进程收到消息后发送回应;

 

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "common.h"

int main(void)
{
	int subPid = 0;
	int fd1[2] = {0}, fd2[2] = {0};
	char readBuffer[BUFFER_SIZE];
	char writeBuffer[BUFFER_SIZE];
	int readLength = 0;
	int writeLength = 0;	
	int ret = 0;

	ret = pipe(fd1);
	if (-1 == ret)
	{
		perror("");
		return -1;
	}

	ret = pipe(fd2);
	if (-1 == ret)
	{
		perror("");
		return -1;
	}
	
	subPid = fork();
	if (0 == subPid)
	{
		close(fd1[1]);
		close(fd2[0]);

		while (true)
		{
			readLength = read(fd1[0], readBuffer, BUFFER_SIZE);
			if (0 > readLength)
			{
				perror("");
				return -1;
			}
			else
			{
				printf("CHILD: Received message \"%s\"!\n", readBuffer);
				strcpy(writeBuffer, "Replay from child!");
				write(fd2[1], writeBuffer, strlen(writeBuffer));
			}
		}
	}
	else
	{
		close(fd1[0]);
		close(fd2[1]);
		int sendCount = 0;
		
		while (true)
		{
			sprintf(writeBuffer, "Message from server (total: %d) !", ++sendCount);
			write(fd1[1], writeBuffer, strlen(writeBuffer));
			readLength = read(fd2[0], readBuffer, BUFFER_SIZE);
			if (0 > readLength)
			{
				perror("");
				return -1;
			}
			
			printf("PARENT: Received replay from child \"%s\"!\n", readBuffer);
			usleep(1000000);
		}
	}

	return 1;
}
 
分享到:
评论

相关推荐

    进程通信.doc

    当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。管道实例见:pipe_rw....

    Linux编程从入门到精通

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    Linux编程白皮书

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    LINUX编程白皮书 (全集)

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    进程间通信(IPC)介绍

    管道,通常指无名管道,是UNIX系统IPC最古老的形式。1、特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。它...

    Linux编程资料

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    LINUX编程白皮书

    6.2.5 关于半双工管道需要注意的几个问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 ...

    linux编程白皮书

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    TCP_IP详解卷1

    26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4 行方式...

    TCP/IP详解 卷1:协议--源代码

    CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《TCP/IP详解 卷1:协议》的源代码 对应的书籍资料见: ... 26.4.5 半双工、一次一字符、一次一行或行方式 304 26.4.6 同步信号 306 26.4.7...

    TCP-IP详解卷一:协议

    26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4 行...

    TCP/IP详解卷

    26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4 行...

    TCP-IP详解卷1.rar

    26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4 行...

    《TCP/IP详解,卷1:协议》

    26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4...

Global site tag (gtag.js) - Google Analytics