使用管道读取读写。程序编译但没有输出。为什么?

时间:2013-05-01 12:00:59

标签: c unix process pipe

我正在尝试使用管道从父进程内部使用 write()编写一个字符串。然后生成一个子进程,其中我读取它,计算单词数量并将单词计数写回。然后让父进程打印单词计数。 我想出了这个:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/wait.h>    
int main(void)
{
int  fd[2], nbytes,status,i,count=0;
pid_t   PID;
char    string[] = "Hello, world\n";
char    readbuffer[80];
pipe(fd);
close(fd[0]);
write(fd[1], string, (strlen(string)+1));

if((PID=fork())<0)
{
    printf("Error\n");
    _exit(0);
}
else if(PID==0)
{

    close(fd[1]);
    nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
    for(i=0;readbuffer[i]!='\0';i++)
    {
        if(readbuffer[i]==' ')
        count++;
    }   
    //open(fd[1]);
    close(fd[0]);
    write(fd[1],&count,1);
    printf("The word count is %d ",count);
    //open(fd[0]);
}
else
{
    wait(&status);
    if(WIFEXITED(status))
{
    close(fd[1]);
    nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
    printf("The word count is %d ",nbytes);
    //open(fd[1]);
}
else
{
    printf("Error\n");
    _exit(0);
}
}
return(0);
}

这编译但我没有得到任何输出。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我无法尝试代码,但看起来你正在关闭子进程中的两个管道端。您使用fd [1]进行写入但它已关闭(在执行读取之前)。

我没有机会编译并尝试使用此代码,因此请将其作为示例并可能修复问题。此示例显示如何使用两个单向管道将数据从父进程发送到子进程以及从子进程发送到父进程。

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

        pipe(fd1);
        pipe(fd2);


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

        if(childpid == 0)
        {
                /* Child process closes up input side of pipe fd1 */
                close(fd1[0]);
               /* Child process closes up output side of pipe fd2 */
                close(fd2[1]);

                /* Send "string" through the output side of pipe */
                write(fd1[1], string, (strlen(string)+1));
                /* Read in a string from the pipe */
                nbytes = read(fd2[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
                exit(0);
        }
        else
        {
                /* Parent process closes up output side of pipe fd1 */
                close(fd1[1]);
                /* Parent process closes up input side of pipe fd2 */
                close(fd2[0]);

                /* Read in a string from the pipe */
                nbytes = read(fd1[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
                /* Send "string" through the output side of pipe */
                write(fd2[1], string, (strlen(string)+1));
        }

        return(0);
}

答案 1 :(得分:0)

我们必须打开管道的读取结束,然后我们才会数据写入管道,否则会出现一个信号SIGPIPE发生,
SIGPIPE 的作用是,它是一个同步信号,当客户端进程无法再写入管道时,它会被接收。此信号执行的默认操作是终止进程。这个信号可以发送到与socket相关联的进程,但不能发送到socket.inorder的进程组,以避免异常终止,进程需要捕获信号并处理它。