我可以将 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.