我可以将 STDIN 用于 IPC 吗?
Can I use STDIN for IPC?
我可以使用标准输入进行进程间通信吗?我编写了以下 gnu c 代码作为实验,但程序在打印定义为 val
的字符后挂起等待输入。发送过程中的换行符和 fflush
似乎都无法缓解该问题。
#include <unistd.h>
#include <stdio.h>
int main(void) {
char val = '!';
int proc = fork();
if (proc < 0)
return -1;
if (proc == 0) {
write(0, &val, 1);
return 0;
}
else {
char ch[2] = { 0 };
read(0, ch, 1);
printf("%s\n", ch);
return 0;
}
return -2;
}
IPC 可以使用管道。现在如果你想使用 STDIN_FILENO 和 STDOUT_FILENO 它看起来像这样:
#include <unistd.h>
#include <stdio.h>
int main(void) {
char val = '!';
int filedes[2];
pipe(filedes);
int proc = fork();
if (proc < 0)
return -1;
if (proc == 0) {
close(1);
dup(filedes[1]);
close(filedes[0]);
close(filedes[1]);
write(1, &val, 1);
return 0;
}
else {
char ch[2] = { 0 };
close(0);
dup(filedes[0]);
close(filedes[0]);
close(filedes[1]);
read(0, ch, 1);
printf("%s\n", ch);
return 0;
}
return -2;
}
组合 close(x) 和 dup(filedes[x]) 关闭 STDOUT/STDIN 将 filedes[x] 复制到第一个可用的描述符中,即您刚刚关闭的内容。正如 Jonathan 示例所建议的那样,现在正在关闭两个 filedes 端并且毫无疑问正在使用 STDIN/STDOUT.
我可以使用标准输入进行进程间通信吗?我编写了以下 gnu c 代码作为实验,但程序在打印定义为 val
的字符后挂起等待输入。发送过程中的换行符和 fflush
似乎都无法缓解该问题。
#include <unistd.h>
#include <stdio.h>
int main(void) {
char val = '!';
int proc = fork();
if (proc < 0)
return -1;
if (proc == 0) {
write(0, &val, 1);
return 0;
}
else {
char ch[2] = { 0 };
read(0, ch, 1);
printf("%s\n", ch);
return 0;
}
return -2;
}
IPC 可以使用管道。现在如果你想使用 STDIN_FILENO 和 STDOUT_FILENO 它看起来像这样:
#include <unistd.h>
#include <stdio.h>
int main(void) {
char val = '!';
int filedes[2];
pipe(filedes);
int proc = fork();
if (proc < 0)
return -1;
if (proc == 0) {
close(1);
dup(filedes[1]);
close(filedes[0]);
close(filedes[1]);
write(1, &val, 1);
return 0;
}
else {
char ch[2] = { 0 };
close(0);
dup(filedes[0]);
close(filedes[0]);
close(filedes[1]);
read(0, ch, 1);
printf("%s\n", ch);
return 0;
}
return -2;
}
组合 close(x) 和 dup(filedes[x]) 关闭 STDOUT/STDIN 将 filedes[x] 复制到第一个可用的描述符中,即您刚刚关闭的内容。正如 Jonathan 示例所建议的那样,现在正在关闭两个 filedes 端并且毫无疑问正在使用 STDIN/STDOUT.