我可以将STDIN用于IPC吗?

时间:2015-06-16 02:28:00

标签: c gcc ipc stdin

我可以使用标准输入进行进程间通信吗?我编写了以下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;
}

1 个答案:

答案 0 :(得分:1)

您可以使用管道进行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所建议的那样,现在关闭两个文件的结尾,毫无疑问是使用STDIN / STDOUT。