C中的单向管道
Unidirectional pipes in C
我在尝试找出如何为 parent 进程和 child 进程制作单独的管道以单向方式运行时遇到问题。即:parent 的描述符及其 child 的不同描述符。
这是我拥有的:
#include <sys/types.h>
int main(int argc, char *argv[]) {
int parent[2];
int child[2];
pid_t pid;
int num = 0;
pipe(parent);
pipe(child);
pid =fork();
if(pid > 0){ // do parent stuff
num = 5;
write(parent[1], &num, sizeof(num));
printf("Parent with pid %d sent value: %d\n", getpid(), num);
close(parent[1]);
}else{ // do child stuff
read(child[0], &num, sizeof(num));
printf("Child with pid %d received value: %d\n", getpid(), num);
close(child[0]);
exit(0);
}
return 0;
}
输出:
Parent with pid 31702 sent value: 5
我知道我应该在 read()
和 write()
命令之前的某个时间点关闭一些描述符,但似乎无论我关闭什么 child 响应在 parent 可以 write()
之前打印,否则我最终会得到一个破损的管道。我应该在哪里关闭描述符以成功地单向使用这些管道?
简而言之,这不是您使用管道的方式。
管道有 read 0
和 write 1
端。
在你的例子中,child 正在从 child[0]
读取,但没有人会通过 child[1]
写入 child。 parent 将写入 parent[1]
。
尝试使用单个管道(将 child[0]
更改为 parent[0]
)。并确保删除在相应流程中不会使用的末端
您制作了两根管子,然后只使用了每根管子的一端;通信不起作用,因为没有人注意任何一个的 other 端。 parent
和 child
是完全独立的管道,你在一个管道上发送的内容不会出现在另一个管道上。你只需要一根管子:
int main(int argc, char *argv[]) {
int pipefd[2];
pid_t pid;
int num = 0;
pipe(pipefd);
pid = fork();
if(pid > 0){ // do parent stuff
close(pipefd[0]); // close the reading end
num = 5;
write(pipefd[1], &num, sizeof(num)); // write on the writing end
printf("Parent with pid %d sent value: %d\n", getpid(), num);
}else{ // do child stuff
close(pipefd[1]); // close the writing end
read(pipefd[0], &num, sizeof(num)); // read on the reading end
printf("Child with pid %d received value: %d\n", getpid(), num);
exit(0);
}
return 0;
}
管道已经是单向的,它给你两个端点:写入端和读取端。你只需要适当地使用每一个。
我在尝试找出如何为 parent 进程和 child 进程制作单独的管道以单向方式运行时遇到问题。即:parent 的描述符及其 child 的不同描述符。
这是我拥有的:
#include <sys/types.h>
int main(int argc, char *argv[]) {
int parent[2];
int child[2];
pid_t pid;
int num = 0;
pipe(parent);
pipe(child);
pid =fork();
if(pid > 0){ // do parent stuff
num = 5;
write(parent[1], &num, sizeof(num));
printf("Parent with pid %d sent value: %d\n", getpid(), num);
close(parent[1]);
}else{ // do child stuff
read(child[0], &num, sizeof(num));
printf("Child with pid %d received value: %d\n", getpid(), num);
close(child[0]);
exit(0);
}
return 0;
}
输出:
Parent with pid 31702 sent value: 5
我知道我应该在 read()
和 write()
命令之前的某个时间点关闭一些描述符,但似乎无论我关闭什么 child 响应在 parent 可以 write()
之前打印,否则我最终会得到一个破损的管道。我应该在哪里关闭描述符以成功地单向使用这些管道?
简而言之,这不是您使用管道的方式。
管道有 read 0
和 write 1
端。
在你的例子中,child 正在从 child[0]
读取,但没有人会通过 child[1]
写入 child。 parent 将写入 parent[1]
。
尝试使用单个管道(将 child[0]
更改为 parent[0]
)。并确保删除在相应流程中不会使用的末端
您制作了两根管子,然后只使用了每根管子的一端;通信不起作用,因为没有人注意任何一个的 other 端。 parent
和 child
是完全独立的管道,你在一个管道上发送的内容不会出现在另一个管道上。你只需要一根管子:
int main(int argc, char *argv[]) {
int pipefd[2];
pid_t pid;
int num = 0;
pipe(pipefd);
pid = fork();
if(pid > 0){ // do parent stuff
close(pipefd[0]); // close the reading end
num = 5;
write(pipefd[1], &num, sizeof(num)); // write on the writing end
printf("Parent with pid %d sent value: %d\n", getpid(), num);
}else{ // do child stuff
close(pipefd[1]); // close the writing end
read(pipefd[0], &num, sizeof(num)); // read on the reading end
printf("Child with pid %d received value: %d\n", getpid(), num);
exit(0);
}
return 0;
}
管道已经是单向的,它给你两个端点:写入端和读取端。你只需要适当地使用每一个。