-4

我尝试在 linux 上用 c 语言学习管道。我写跟随程序。这个程序有错误吗?

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>


int main (void)
{
    int fd[2], nbytes;
    pid_t childpid;
    char string[]= "Hello, World!\n";
    char readbuffer[80];


    pipe(fd);

    if((childpid = fork()) == -1)
    {
        perror("fork");
        exit(0);    
    } 

    if(childpid == 0)
    {
        // child process closes up input side of pipe.
        close(fd[0]);

        // send "string" through the output side of pipe.
        write(fd[1], string, strlen(string));
        exit(0);
    }

    else
    {
        // parent process closes up output side of pipe.
        close(fd[0]);

        // Read in a string from pipe.
        nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
        printf("Received string = %s\n", readbuffer);
    }

    return 0;
}

有什么问题吗?

4

1 回答 1

1

这两个代码段之一是不正确的,仅基于注释:

if (childpid == 0)
{
    // child process closes up input side of pipe.
    close(fd[0]);

和:

else
{
    // parent process closes up output side of pipe.
    close(fd[0]);

您实际上需要关闭fd[1]父级(写作端)。令人惊讶的是,您的read调用是正确的,但是是从您刚刚在原始文件中关闭的文件描述符中读取的。

请注意,您应该只打印您阅读的内容(并且只有在您成功阅读的情况下):

if (nbytes > 0)
    printf("Received string: <<%.*s>>\n", nbytes, readbuffer);
else if (nbytes == 0)
    printf("Received no data\n");
else
    printf("Received error (%d: %s)\n", errno, strerror(errno));

(请注意,您需要<errno.h><string.h>最后一行才能正确编译。)

和标记在那里很简单<<>>因此您可以看到尾随空格等。如果您愿意,可以省略它们。

于 2012-10-28T17:41:59.390 回答