[英]Can you choose which child process receives a message from a parent?
Below I have code of a parent process creating two child processes that belong to it.下面我有一个父进程的代码,它创建了两个属于它的子进程。 Now, I know I can make it so that the parent can write to a child process and the child process can read from it using read() and write().
现在,我知道我可以这样做,以便父进程可以写入子进程,子进程可以使用 read() 和 write() 从中读取。
My question is, is it possible for the parent to choose in this code below which child to write to?我的问题是,父母是否可以在下面的代码中选择要写给哪个孩子? For example I asked the user of the program if he wanted to write to child process 1 or child process 2 with their own supplied message, how would I go about that?
例如,我问程序的用户是否想用他们自己提供的消息写入子进程 1 或子进程 2,我该怎么做?
int p1[2];
int p2[2];
pid_t child_a, child_b;
if(pipe(p1) == -1){
printf("error in creating pipe\n");
exit(-1);
}
if(pipe(p2) == -1){
printf("error in creating pipe\n");
exit(-1);
}
child_a = fork();
if (child_a == 0) {
/* Child A code */
} else {
child_b = fork();
if (child_b == 0) {
/* Child B code */
} else {
/* Parent Code */
}
}
You've already created two pipes, so you're on the right track.您已经创建了两个管道,因此您走在正确的轨道上。 You can use one pipe, say
p1
, to send messages from the parent to child_a
, and use p2
to send messages to child_b
.您可以使用一个管道,例如
p1
,将消息从父级发送到child_a
,并使用p2
将消息发送到child_b
。
You can use dup2
to switch the stdin file descriptor for a您可以使用
dup2
切换标准输入文件描述符
int p1[2];
int p2[2];
pid_t child_a, child_b;
if(pipe(p1) == -1){
printf("error in creating pipe\n");
exit(-1);
}
if(pipe(p2) == -1){
printf("error in creating pipe\n");
exit(-1);
}
child_a = fork();
if (child_a == 0) {
/* Child A code */
// now can read from stdin to receive messages from parent process
dup2(p1[0], STDIN_FILENO);
// don't forget to close file descriptors that are open in every process!
close(p1[0]); close(p1[1]);
} else {
child_b = fork();
if (child_b == 0) {
/* Child B code */
dup2(p2[0], STDIN_FILENO);
close(p2[0]); close(p2[1]);
} else {
/* Parent Code */
// Write something to child A
write(p1[1], some_text, num_bytes);
// Write something to child B
write(p2[1], some_other_text, num_other_bytes);
}
}
Keep in mind that write
takes an int
file descriptor, a void*
buffer to write -- which can be a char*
, and an int
number of bytes to write to the file descriptor.请记住,
write
需要一个int
文件描述符,一个要写入的void*
缓冲区——它可以是一个char*
,以及一个要写入文件描述符的int
字节数。
Here's the write
documentation from the POSIX API: https://linux.die.net/man/2/write这是 POSIX API 的
write
文档: https : //linux.die.net/man/2/write
And here's the documentation for dup2
: https://linux.die.net/man/2/dup2这是
dup2
的文档: https : dup2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.