从管道读取时的随机字符

时间:2013-01-02 01:11:17

标签: c++ operating-system fork ipc pipe

在以下代码中:

    ...
    char *message = "This is the message!";
    ...

    printf("Writing to file descriptor FD[%i] \n", fd[1]);
    write( fd[1], message, strlen(message));
    printf("Reading from file descriptor FD[%i] \n", fd[0]);
    read( fd[0], buffer, strlen(message));
    printf("Message from FD[%i] : \"%s\" .\n", fd[0], buffer);

我得到以下输出:

 "This is the message!���" .

但如果我删除“!”从我的消息,输出没有随机字符...任何想法为什么我会出现这3个随机字符?

1 个答案:

答案 0 :(得分:7)

当您编写长度为strlen(whatever)的邮件时,的邮件会包含终止NUL字符。因此,另一端出现的是一个C字符串,而只是一个字符集。

跟随内存中的字符集合完全取决于从管道中读取它们之前的内容。因为它不是C字符串(除非偶然发生已经包含NUL的内存位置可能发生意外),否则不应将其传递给printf且无限制{{1}格式说明符。

这里有两种可能性。第一种是将NUL字符与数据一起发送,例如:

%s

或(可能更好)使用write (fd[1], message, strlen(message) + 1); 的返回值,它告诉你读取了多少字节,如:

read