`
icarusliu
  • 浏览: 238091 次
  • 性别: 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;
}
 
分享到:
评论

相关推荐

    linux下C和java通过管道通信

    总结来说,Linux下的C和Java程序可以通过管道进行通信,这涉及到C语言的`pipe()`、`fork()`和`write()`/`read()`函数,以及Java的`java.nio.Pipe`类。理解这些基础知识对于实现进程间的协同工作至关重要。

    linux C语言开发管道通信实例详解

    首先,管道通信允许一个进程向另一个进程发送数据,这种通信方式是半双工的,即数据只能在一个方向上流动。管道分为匿名管道和命名管道,这里我们讨论的是匿名管道。匿名管道在创建时不需要指定文件名,由系统自动...

    Linux系统管道和有名管道的通信机制

    - **半双工通信**:数据只能单向流动,例如从管道的一端写入,从另一端读出。 - **亲缘关系限制**:普通管道仅能在有亲缘关系的进程之间使用,通常是父子进程或兄弟进程。 - **独立文件系统**:管道作为独立的...

    windows命名管道通信

    这种通信方式提供了半双工(即单向)的通信通道,但可以通过创建两个相反方向的管道来实现全双工通信。 **基本概念** 1. **管道名称**:每个命名管道都有一个唯一的名称,用于标识和访问管道。名称可以是本地管道...

    嵌入式有名管道随机数.rar

    3. **有名管道(命名管道)**:在Unix和类Unix系统中,有名管道是一种半双工通信机制,允许不同进程之间传递数据。与无名管道相比,有名管道可以通过文件系统路径名进行访问,因此可以被多个不相关的进程共享。在这...

    Linux C程序设计大全-进程间通信IPC

    管道分为匿名半双工管道和全双工管道,其中匿名管道无名称且随进程结束而消失。例如,`ls | grep ipc`命令使用的就是半双工管道,grep的输入是ls的输出。 14.2.1 管道的概念 管道在系统中表现为类似文件的实体,...

    管道通信命名管道通信

    无名管道是半双工的(即数据只能单向流动),并且只能在具有亲缘关系的进程间使用。通常用于父子进程或兄弟进程之间的通信。在创建无名管道时,使用`pipe()`系统调用创建一对文件描述符,一个用于写入,另一个用于...

    LINUX管道通信实验报告

    通过这个实验,我们深入了解了Linux管道通信的工作原理,掌握了如何在C程序中实现管道通信,并理解了其在实际操作中的应用。管道通信虽然简单,但在多进程协同工作时起到了关键作用,尤其在shell脚本中,它的灵活性...

    ipc.rar_IPC_管道_管道通信_管道通信c++

    1. **管道的基本概念**:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用,通常是在父子进程或兄弟进程之间。 2. **管道创建**:在C++中,创建管道通常使用`pipe()`系统调用...

    guandao.rar_ 管道 通信_VC 管道_多进程_管道通信_管道通信c

    管道是一种半双工的通信机制,即数据只能单向流动,但可以在两个方向上分别设置管道,实现双向通信。管道通信通常分为匿名管道和命名管道两种类型。匿名管道仅适用于具有亲缘关系的进程间通信,如父进程与子进程;而...

    理解无名管道及有名管道

    在C语言中,可以通过调用`pipe()`函数来创建管道。这个函数的原型如下: ```c #include int pipe(int fd[2]); ``` 参数`fd[2]`是一个数组,用于存储管道的两个端口。`fd[0]`通常用于读取管道中的数据,而`fd[1]`...

    VC命名管道程序及资料

    在VC++编程环境中,我们可以利用Microsoft的C运行时库(CRT)和Windows API来创建和使用命名管道。在这个"VC命名管道程序及资料"中,我们很可能会找到关于如何在VC++环境下实现命名管道通信的详细教程和示例代码。 ...

    匿名管道实现进程间通信示例程序

    1. **创建管道**:在C语言中,我们可以使用`pipe()`系统调用来创建匿名管道。这个函数返回两个文件描述符,一个用于写入(父进程通常使用),另一个用于读取(子进程通常使用)。 2. ** fork() 创建子进程**:在...

    进程的管道通信实验 操作系统 课程设计

    它创建一个单向的、半双工的数据通道,即数据只能在一个方向上流动,且两个进程之间共享这个管道,一个作为读端,另一个作为写端。在本课程设计中,你可能会涉及到创建管道、设置读写端、数据的传输以及同步问题。 ...

    命名管道通信

    - `CPipe`:MFC提供的命名管道类,用于创建、打开和管理命名管道。 实现命名管道通信的基本步骤如下: 1. **创建服务器端**:服务器进程首先创建命名管道,这通常涉及到`CreateNamedPipe`函数的调用,设置管道的...

    C Pipe h h h .rar

    本资源"Linux C 管道通信"主要涵盖了如何在C语言环境下利用管道进行数据交换的知识。 管道是一种半双工的通信方式,允许数据在一个方向上流动。它由内核提供支持,通过一个特殊的文件描述符进行访问。创建管道通常...

    无名管道示例代码

    标题中的“无名管道示例代码”是指一个实际的C语言程序,用于演示如何在Linux环境下创建和使用无名管道。这种示例通常会包含创建管道、设置文件描述符、写入和读取数据等步骤。 首先,创建无名管道需要用到`pipe()`...

    进程间软中断通信和管道通信

    管道是一种半双工的通信方式,数据只能单向流动,且具有先进先出(FIFO)的特点。在两个进程之间创建一个管道,可以使得一个进程的数据被另一个进程读取。在Linux中,可以使用`pipe()`函数创建管道,然后通过`fork()...

    进程间命名管道通信机制的使用

    命名管道是一种半双工的通信方式,即数据只能在一个方向上传输。与无名管道不同的是,命名管道存在于文件系统中,因此可以在没有亲缘关系的进程之间进行通信。这意味着即使创建命名管道的进程不再存在,其他进程也...

    无名管道 进程间的通信

    无名管道是一种只存在于内存中的特殊文件,它为具有共同祖先的两个进程之间提供了一种半双工的通信方式。也就是说,数据只能单向流动:一个进程(通常是父进程)写入管道,而另一个进程(通常是子进程)从管道中读取...

Global site tag (gtag.js) - Google Analytics