父进程不断发送消息到子进程,子进程收到消息后发送回应;
#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程序可以通过管道进行通信,这涉及到C语言的`pipe()`、`fork()`和`write()`/`read()`函数,以及Java的`java.nio.Pipe`类。理解这些基础知识对于实现进程间的协同工作至关重要。
首先,管道通信允许一个进程向另一个进程发送数据,这种通信方式是半双工的,即数据只能在一个方向上流动。管道分为匿名管道和命名管道,这里我们讨论的是匿名管道。匿名管道在创建时不需要指定文件名,由系统自动...
- **半双工通信**:数据只能单向流动,例如从管道的一端写入,从另一端读出。 - **亲缘关系限制**:普通管道仅能在有亲缘关系的进程之间使用,通常是父子进程或兄弟进程。 - **独立文件系统**:管道作为独立的...
这种通信方式提供了半双工(即单向)的通信通道,但可以通过创建两个相反方向的管道来实现全双工通信。 **基本概念** 1. **管道名称**:每个命名管道都有一个唯一的名称,用于标识和访问管道。名称可以是本地管道...
3. **有名管道(命名管道)**:在Unix和类Unix系统中,有名管道是一种半双工通信机制,允许不同进程之间传递数据。与无名管道相比,有名管道可以通过文件系统路径名进行访问,因此可以被多个不相关的进程共享。在这...
管道分为匿名半双工管道和全双工管道,其中匿名管道无名称且随进程结束而消失。例如,`ls | grep ipc`命令使用的就是半双工管道,grep的输入是ls的输出。 14.2.1 管道的概念 管道在系统中表现为类似文件的实体,...
无名管道是半双工的(即数据只能单向流动),并且只能在具有亲缘关系的进程间使用。通常用于父子进程或兄弟进程之间的通信。在创建无名管道时,使用`pipe()`系统调用创建一对文件描述符,一个用于写入,另一个用于...
通过这个实验,我们深入了解了Linux管道通信的工作原理,掌握了如何在C程序中实现管道通信,并理解了其在实际操作中的应用。管道通信虽然简单,但在多进程协同工作时起到了关键作用,尤其在shell脚本中,它的灵活性...
1. **管道的基本概念**:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用,通常是在父子进程或兄弟进程之间。 2. **管道创建**:在C++中,创建管道通常使用`pipe()`系统调用...
管道是一种半双工的通信机制,即数据只能单向流动,但可以在两个方向上分别设置管道,实现双向通信。管道通信通常分为匿名管道和命名管道两种类型。匿名管道仅适用于具有亲缘关系的进程间通信,如父进程与子进程;而...
在C语言中,可以通过调用`pipe()`函数来创建管道。这个函数的原型如下: ```c #include int pipe(int fd[2]); ``` 参数`fd[2]`是一个数组,用于存储管道的两个端口。`fd[0]`通常用于读取管道中的数据,而`fd[1]`...
在VC++编程环境中,我们可以利用Microsoft的C运行时库(CRT)和Windows API来创建和使用命名管道。在这个"VC命名管道程序及资料"中,我们很可能会找到关于如何在VC++环境下实现命名管道通信的详细教程和示例代码。 ...
1. **创建管道**:在C语言中,我们可以使用`pipe()`系统调用来创建匿名管道。这个函数返回两个文件描述符,一个用于写入(父进程通常使用),另一个用于读取(子进程通常使用)。 2. ** fork() 创建子进程**:在...
它创建一个单向的、半双工的数据通道,即数据只能在一个方向上流动,且两个进程之间共享这个管道,一个作为读端,另一个作为写端。在本课程设计中,你可能会涉及到创建管道、设置读写端、数据的传输以及同步问题。 ...
- `CPipe`:MFC提供的命名管道类,用于创建、打开和管理命名管道。 实现命名管道通信的基本步骤如下: 1. **创建服务器端**:服务器进程首先创建命名管道,这通常涉及到`CreateNamedPipe`函数的调用,设置管道的...
本资源"Linux C 管道通信"主要涵盖了如何在C语言环境下利用管道进行数据交换的知识。 管道是一种半双工的通信方式,允许数据在一个方向上流动。它由内核提供支持,通过一个特殊的文件描述符进行访问。创建管道通常...
标题中的“无名管道示例代码”是指一个实际的C语言程序,用于演示如何在Linux环境下创建和使用无名管道。这种示例通常会包含创建管道、设置文件描述符、写入和读取数据等步骤。 首先,创建无名管道需要用到`pipe()`...
管道是一种半双工的通信方式,数据只能单向流动,且具有先进先出(FIFO)的特点。在两个进程之间创建一个管道,可以使得一个进程的数据被另一个进程读取。在Linux中,可以使用`pipe()`函数创建管道,然后通过`fork()...
命名管道是一种半双工的通信方式,即数据只能在一个方向上传输。与无名管道不同的是,命名管道存在于文件系统中,因此可以在没有亲缘关系的进程之间进行通信。这意味着即使创建命名管道的进程不再存在,其他进程也...
无名管道是一种只存在于内存中的特殊文件,它为具有共同祖先的两个进程之间提供了一种半双工的通信方式。也就是说,数据只能单向流动:一个进程(通常是父进程)写入管道,而另一个进程(通常是子进程)从管道中读取...