从文件读取数据并通过管道将其发送到另一个进程时出错

时间:2014-11-13 07:29:41

标签: c unix pipe

我想创建一个由两个通过管道进行通信的进程组成的系统。第一个进程读取文件的内容并将其写入管道,而第二个进程在终端上打印出来。我编写程序但接收器进程在文件有多行时没有正确接收数据。它会在每次迭代时从行的开头删除一个字符。有任何线索请解决这个问题

p1代码

#define BUFFER_SIZE 10
#define NAMED_PIPE "./namedpipe"

void main(int argc, char *argv[])
{ 
    if (argc != 2)
    {
        printf("The usage of this program is:\n");
        printf("execute cmd.txt\n");
        return;
    }
    /* initialize the pipe and fork variables */
    int fd;
    char *infile = argv[1];
    char buffer[BUFFER_SIZE];

    FILE *in;
    in = fopen(infile, "r");
    if (in == NULL)
    {
        fprintf(stderr, "Error opening file %s\n", infile);
        return;
    }

    fd = open(NAMED_PIPE, O_WRONLY);

    while (fscanf(in,"%s",buffer)>0)
    {
        write(fd, buffer, (strlen(buffer)+1));
    } 
    fclose(in);
}

而p2

#define BUFFER_SIZE 10
#define NAMED_PIPE "./namedpipe"

int main()
{ 
    int fd,ret;
    char buffer[BUFFER_SIZE];
    ret=mkfifo(NAMED_PIPE,0666);
    if (ret == -1)
    {
        printf("Error creating the named pipe");
        exit (1);
    }
    fd = open(NAMED_PIPE, O_RDONLY);
    while(1)
    {
        if (read(fd, buffer, sizeof(buffer)) > 0)
        {
            printf("read [%s]\n",buffer);
        }
        else
            return;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以定义10个字符的缓冲区,并使用fscanf读取输入文件。 RTFM fscanf将用于格式化输入,永远不会使用原始%s输入文本,但始终将输入的大小限制为字段大小。在这里,至少"%9s"留下一个地方来终止null。

但事实上,为了阅读未格式化的文本,正确的函数是fgets。所以在pt1中你应该有:

fd = open(NAMED_PIPE, O_WRONLY);

 while (fgets(buffer, sizeof(buffer), in) != NULL)
 {
    write(fd, buffer, (strlen(buffer)));
 } 
 close(fd);
 fclose(in);
}

在pt2中,你应该留一个终止null的地方并手动添加它,因为只读读取字节并给你字节数。你至少应该写:

while(1)
{
    if ((ret = read(fd, buffer, sizeof(buffer) - 1)) > 0)
    {
        buffer[ret] = '\0';
        printf("read [%s]\n",buffer);
    }
    else
    return;
}