如何为多个进程实现管道?
How to implement pipes for multiple processes?
我正在创建多个进程,我需要为每个进程创建两个未命名的管道。
对于每个child,将使用一个管道从parent获取int值;一个用于发送到 int 数组到 parent。 Parent 会做一些事情 同时 从 child 获取新数据。
基础代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for reaching unix operations
int main(int argc, char *argv[]){
pid_t main = getpid();
int N = 30;
int i;
pid_t* children = (pid_t*) malloc(sizeof(pid_t) * N);
for(i = 0; i < N; i++){
pid_t child = fork();
if ( child == 0){
pid_t me = getpid();
printf("I'm a child and my pid is: %d\n", me);
sleep(1);
// exit(4);
return me * 2;
} else if ( child < 0){
// printf("Could not create child\n");
} else {
children[i] = child;
// printf("I have created a child and its pid %d\n", child);
}
}
// The child never reaches here
for(i = 0; i < N; i++){
int status;
waitpid(children[i], &status, 0);
printf("Process %d exited with return code %d\n", children[i], WEXITSTATUS(status));
}
return 0;
}
我尝试了很多东西都没有成功,我迷路了。你能帮我继续吗?
感谢任何帮助!谢谢。
以下是如何为每个 child 进程设置一个管道,以便每个 child 写入 parent:
因为每个 child 需要两个文件描述符,声明:
int fd[2 * N];
适当地初始化它们:
for (int i = 0; i < N; i++) {
pipe(&fd[2*i]);
}
在第 i
-th child 进程中,使用:
write(fd[2*i + 1], write_buffer, SIZE)
写入parent,在parent中使用:
read(fd[2*i], read_buffer, SIZE)
从第 i
开始阅读 child。
要关闭管道:
在第i
个child内,可以使用
close(fd[2*i])
马上,因为你只是在写作。写完电话后
close(fd[2*i + 1])
关闭管道的写端。
情况与 parent 平行:从第 i
开始阅读时 child 你可以
close(fd[2*i + 1])
马上,因为你不写,读完后打电话给
close(fd[2*i])
关闭管道的读取端。
由于每个 child 进程需要 两个 管道,因此创建两个数组 - 一个包含 children 写入 [=63= 的管道],还有一个包含用于 parent 写入 children.
的管道
我正在创建多个进程,我需要为每个进程创建两个未命名的管道。
对于每个child,将使用一个管道从parent获取int值;一个用于发送到 int 数组到 parent。 Parent 会做一些事情 同时 从 child 获取新数据。
基础代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> // for reaching unix operations
int main(int argc, char *argv[]){
pid_t main = getpid();
int N = 30;
int i;
pid_t* children = (pid_t*) malloc(sizeof(pid_t) * N);
for(i = 0; i < N; i++){
pid_t child = fork();
if ( child == 0){
pid_t me = getpid();
printf("I'm a child and my pid is: %d\n", me);
sleep(1);
// exit(4);
return me * 2;
} else if ( child < 0){
// printf("Could not create child\n");
} else {
children[i] = child;
// printf("I have created a child and its pid %d\n", child);
}
}
// The child never reaches here
for(i = 0; i < N; i++){
int status;
waitpid(children[i], &status, 0);
printf("Process %d exited with return code %d\n", children[i], WEXITSTATUS(status));
}
return 0;
}
我尝试了很多东西都没有成功,我迷路了。你能帮我继续吗?
感谢任何帮助!谢谢。
以下是如何为每个 child 进程设置一个管道,以便每个 child 写入 parent:
因为每个 child 需要两个文件描述符,声明:
int fd[2 * N];
适当地初始化它们:
for (int i = 0; i < N; i++) {
pipe(&fd[2*i]);
}
在第 i
-th child 进程中,使用:
write(fd[2*i + 1], write_buffer, SIZE)
写入parent,在parent中使用:
read(fd[2*i], read_buffer, SIZE)
从第 i
开始阅读 child。
要关闭管道:
在第i
个child内,可以使用
close(fd[2*i])
马上,因为你只是在写作。写完电话后
close(fd[2*i + 1])
关闭管道的写端。
情况与 parent 平行:从第 i
开始阅读时 child 你可以
close(fd[2*i + 1])
马上,因为你不写,读完后打电话给
close(fd[2*i])
关闭管道的读取端。
由于每个 child 进程需要 两个 管道,因此创建两个数组 - 一个包含 children 写入 [=63= 的管道],还有一个包含用于 parent 写入 children.
的管道