从管道读取时的随机字符

Erw*_*ald 4 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);
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

 "This is the message!???" .
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 7

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

什么如下内存的字符集是完全依赖于什么在那里你从管道中读取它们之前.因为它不是C字符串(除非偶然发生的内存位置已经包含NUL,否则可能发生意外),您不应该printf使用无界%s格式说明符将其传递给它.

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

write (fd[1], message, strlen(message) + 1);
Run Code Online (Sandbox Code Playgroud)

或者(可能更好)使用返回值来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);
Run Code Online (Sandbox Code Playgroud)