0

我正在尝试使用管道从父进程内部使用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);
}

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

4

2 回答 2

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);
}
于 2013-05-01T12:11:35.193 回答
0

我们必须打开管道的读端,在我们将数据写入管道之前,否则会出现一个称为SIGPIPE的信号,SIGPIPE
所做的是,它是一个同步信号,当客户端进程可以接收时不再写入管道。此信号执行的默认操作是终止进程。该信号只能发送到与套接字关联的进程,而不能发送到套接字的进程组。为了避免异常终止,进程需要捕获信号并处理它。

于 2014-12-17T14:36:23.363 回答