无法正确读取管道中的值

时间:2015-10-03 03:40:40

标签: c cygwin pipe fork

我试图在C(使用CygWin和Dev-C ++)中启动一个简单的管道来传递父项和单个子项之间的值。这是parent代码(pipesnd.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int FIFO[2];
    char *msg = "This is a test message";
    char str[10];



    if (pipe(FIFO) == -1)
    {
        printf("cannot create pipe\n");
        exit(1);
    }
    write(FIFO[1], msg, strlen(msg));

    sprintf(str, "%d", FIFO[0]);
    printf("I am the parent and this was in the pipe: %s \n", str);
    fflush(stdout);




    switch (fork())
    {
    case 0:
        execl("c:/Dev-Cpp/Lift 2/pipercv", "pipercv", str, NULL);  
        exit(1);
    case -1:
        perror("fork() failed:");
        exit(2);
    default:

    }






    exit(0);
}

child代码(pipercv.c):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define NBUF 100
int main(int argc, char *argv[])
{
    int fd;
    char buf[NBUF];
    if (argc != 2)
    {
        printf("expect pipercv fd\n");
        exit(1);
    }
    fd = atoi(argv[1]);


    read(fd, buf, 20);
    buf[20] = '\0';
    printf("I am the child and this was in the pipe: %s \n", buf);
    fflush(stdout);
    sleep(10);

}

结果:

enter image description here

如何在子级和父级(双向)中传递/查看整个邮件?

2 个答案:

答案 0 :(得分:0)

问题是您从buf中读取了20个字符,然后将\0添加为第20个字符,最后输出结果。你的信息 This is a test message 包含更多字符。

答案 1 :(得分:0)

传输的字符串实际上是24字节&#39;这是测试消息&#39; +尾随NUL字节。

只读取20个字符是错误的主要部分。

在子节点中建议将缓冲区初始化为所有NUL字节:

char buf[NBUF] = {'\0'};

然后在读取数据后不需要插入终止NUL字节。

为了确保在子节点中读取正确的字节数,建议子节点的第二个命令行参数指示要读取的字节数。

使用read()语句中的传入字节计数,而不是使用具有选择超时的select / read循环。