1

我编写了以下代码,使用 fork 和管道将字符串“hello world”复制到另一个 char 数组,而不是使用标准库函数或标准 i/o 流。该程序编译成功,但我没有得到任何输出。甚至,没有显示 printf 的输出。

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

char string[] = "hello world";

int main()

{

        int count, i;
        int toPar[2], toChild[2];
        char buf[256];
        pipe(toPar);
        pipe(toChild);

        if (fork() == 0)
        {
                printf("\n--- child process ---");
                close(0);
                dup(toChild[0]);
                close(1);
                dup(toPar[1]);
                close(toPar[1]);
                close(toChild[0]);
                close(toPar[0]);
                close(toChild[1]);
                for (;;)
                {
                        if ((count = read(0, buf, sizeof(buf))) == 0)
                                break;
                        printf("\nChild buf: %s", buf);
                        write(1, buf, count);
                }
        }

        printf("\n--- parent process ---");
        close(1);
        dup(toChild[1]);
        close(0);
        dup(toPar[0]);
        close(toPar[1]);
        close(toChild[0]);
        close(toPar[0]);
        close(toChild[1]);
        for (i = 0; i < 15; i++)
        {
                write(1, string, strlen(string));
                printf("\nParent buf: %s", buf);
                read(0, buf, sizeof(buf));
        }
        return 0;

   }
4

3 回答 3

4

printf的 s 正在写入stdout- 但在父级和子级中,您已将文件描述符 1 重定向到管道,因此这就是printf输出的去向。

而不是printf(...),使用fprintf(stderr, ...)- 然后你将能够看到输出,因为stderr它仍然指向你的终端。

请注意,您有几个错误:

  • 孩子应该_exit(0)在完成后调用,否则它会掉入父代码;
  • write应该使用,strlen(string) + 1以便写入 nul 终止符。
于 2010-01-19T10:39:48.360 回答
0

尝试添加“\n”,例如printf("\nParent buf: %s\n", buf);

于 2010-01-19T10:19:14.180 回答
0

我猜这些管道正在阻塞 IO,因此除非管道被其他进程关闭,否则 read 将根本不会返回。那和 printf 做缓冲 IO 会阻止您获得任何输出。

于 2010-01-19T10:30:47.293 回答