未命名的管道在我的代码中不起作用

时间:2012-10-28 09:38:14

标签: c pipe

我得到了一些奇怪的输出:

Read 0 bytes: P
?\?  

来自我的代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

char phrase[0] = "stuff this in your pipe and smoke it";
int main(int argc, char* argv[]) {
    int fd[2], bytesRead;
    char message[100];
    int pid;
    pid = fork();
    pipe(fd);
    if (pid == 0) {
        close(fd[0]);
        write(fd[1], phrase, strlen(phrase) + 1);
        close(fd[1]);
    }else {
        close(fd[1]);
        bytesRead = read(fd[0], message, 100);
        printf("Read %d bytes: %s\n", bytesRead, message);
        close(fd[0]);

    }
}

我不知道我哪里出错了,不知道吗?

2 个答案:

答案 0 :(得分:2)

pid = fork();
pipe(fd);

当子进程从父进程继承描述符时,此示例有效。您需要在pipe 之前致电fork

答案 1 :(得分:2)

@cnicutar已经回答了一个问题。另一个问题是:

 char phrase[0] = "stuff this in your pipe and smoke it";

声明一个0长度的数组,并且存储的字符串要长得多。

将其更改为:

char phrase[] = "stuff this in your pipe and smoke it";

C标准规定数组的大小应大于零。

来自C99,6.7.5.2:

  

如果它们分隔表达式(指定数组的大小),   表达式应具有整数类型。如果表达式是   常量表达式,它的值应大于零。