进程间通信如何实现子进程向向父进程发了东西后,父进程再向子进程发送东西的代码
时间: 2024-06-10 14:08:09 浏览: 24
这是一个关于进程间通信的问题,我可以为您提供一个可能的答案:
在父子进程之间进行双向通信,可以使用管道(pipe)实现。具体地,在父进程创建一个管道后,通过fork()系统调用创建子进程,并将管道的读写端分别传递给父进程和子进程。这样,子进程可以将需要发送的数据写入管道,父进程则可以从管道中读取数据。
以下是可能的代码实现:
```
#include <unistd.h> // 包含fork()等函数头文件
#include <stdio.h> // 包含标准输入输出函数头文件
#include <stdlib.h> // 包含exit()函数头文件
#include <string.h> // 包含字符串处理函数头文件
#include <sys/types.h> // 包含pid_t等类型定义
#include <sys/wait.h> // 包含wait()等函数头文件
int main() {
int fd[2]; // 管道文件描述符数组
pid_t pid; // 进程ID变量
char buf[1024]; // 数据缓冲区
int len; // 数据长度变量
if (pipe(fd) < 0) { // 创建管道失败
perror("pipe error");
exit(-1);
}
if ((pid = fork()) < 0) { // 创建子进程失败
perror("fork error");
exit(-1);
} else if (pid > 0) { // 父进程
close(fd[0]); // 关闭读端
while (1) { // 循环读取子进程发送的数据
printf("Please input data to send (input \"exit\" to quit): ");
fgets(buf, sizeof(buf), stdin);
len = strlen(buf);
if (len > 0 && buf[len-1] == '\n') { // 去掉回车符
buf[len-1] = '\0';
}
if (strcmp(buf, "exit") == 0) { // 用户输入退出命令
break;
}
write(fd[1], buf, strlen(buf)+1); // 向管道中写入数据
len = read(fd[0], buf, sizeof(buf)); // 从管道中读取数据
buf[len-1] = '\0'; // 去掉回车符
printf("Received data from child process: %s\n", buf);
}
close(fd[1]); // 关闭写端
waitpid(pid, NULL, 0); // 等待子进程退出
} else { // 子进程
close(fd[1]); // 关闭写端
while (1) { // 循环读取父进程发送的数据
len = read(fd[0], buf, sizeof(buf)); // 从管道中读取数据
if (len <= 0) { // 读取失败或管道已关闭
break;
}
buf[len-1] = '\0'; // 去掉回车符
printf("Received data from parent process: %s\n", buf);
printf("Please input data to send (input \"exit\" to quit): ");
fgets(buf, sizeof(buf), stdin);
len = strlen(buf);
if (len > 0 && buf[len-1] == '\n') { // 去掉回车符
buf[len-1] = '\0';
}
if (strcmp(buf, "exit") == 0) { // 用户输入退出命令
break;
}
write(fd[1], buf, strlen(buf)+1); // 向管道中写入数据
}
close(fd[0]); // 关闭读端
exit(0); // 退出子进程
}
return 0;
}
```
希望以上代码能够帮到您!