6

在以下代码中:

    ...
    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 个随机字符吗?

4

1 回答 1

8

当您编写长度消息时strlen(whatever)包括终止 NUL 字符。因此,在另一端出现的不是C 字符串,而只是字符的集合。

内存中字符集合之后的内容完全取决于您从管道中读取它们之前的内容。由于它不是 C 字符串(如果后面的内存位置恰好已经包含 NUL,则可能发生意外除外),因此您不应printf使用无界%s格式说明符将其传递给。

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

write (fd[1], message, strlen(message) + 1);

或者(可能更好)使用返回值read告诉您读取了多少字节,例如:

int sz = read (fd[0], buffer, sizeof(buffer));
// should probably check sz here as well.
printf ("Message from FD[%i] : \"%*s\" .\n", fd[0], sz, buffer);
于 2013-01-02T01:15:39.300 回答