c - c 中的管道消息被截断

标签 c string pipe strlen

我编写了一个简单的程序来学习如何用 C 语言编写管道消息,在执行过程中我发现了一些我无法解释或理解的相当奇怪的东西,这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100
int fd[2];

void writeMsg() {
    int i;
    char message[MAXSIZE];
    for (i = 0; i < 12; i++) {
        sprintf(message,"%d%d%d%d%d%d%d%d%d%d\n",i,i,i,i,i,i,i,i,i,i);
        write(fd[1], message, strlen(message));
    }
}

int main() {
    pipe(fd);
    char message[MAXSIZE];
    int pid;
    pid = fork();
    if (pid == 0) {
        writeMsg();
    }
    if (pid > 10) {
        wait(NULL);
        read(fd[0], message, MAXSIZE);
        printf("%s", message);
    }
    return 0;
}

在 writeMsg 中,有一个循环在管道中写入大于 MAXSIZE 的消息,之后在 main 中读取并打印该消息,奇怪的是,如果我在中使用 strlen(message) write(fd[1], message, strlen(message)) 打印以下消息:

0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9

但是如果我使用 write(fd[1], message, strlen(message)+1) 消息是:

0000000000

strlen(message)strlen(message)+1 有什么区别?在这里http://codewiki.wikidot.com/c:system-calls:write据说,如果要写入的字节数小于提供的缓冲区,则输出将被截断,但+1 后,字符串大小为 11,不大于 MAXSIZE。 欢迎任何澄清或更正。

最佳答案

+1 会导致字符串末尾(换行符之后)的零被传输,这意味着当您在另一端打印缓冲区时,printf 在第一个字符之后停止线。我想,你并不是真的想发送那个零,所以不要这样做......

如果您确实希望字符串末尾的零通过管道,则必须找出每个字符串的结尾位置,并单独打印它们,例如使用 strlen() 计算消息的长度,并使用移动的索引 index += strlen(&message[index])+1 printf("%s", &message[index]); 循环执行,直到打印完所有内容(将索引与您已阅读的内容进行比较!)。

使用循环直到read返回零字节应该允许您读取所有输入(您现在读取的内容太短,这就是为什么您没有获得所有9的原因)。

关于c - c 中的管道消息被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18243750/

相关文章:

c - for 循环和 size_t 的奇怪行为

C : Debugging & Run - Different Output

delphi - 如何将 TByte 转换为 RawByteString?

java - 将字符串中的单词拆分为数组,但如果它们位于斜杠之间则不拆分

C 奇怪的编译器行为

c++ - 缺失项目最终数组列表

c - 返回字符串数组

c - 了解管道、fork 和 exec - C 编程

c - 这个 IF 语句中的语句是如何工作的?

python - 使用 Python 多处理管理器 (BaseManager/SyncManager) 与远程机器共享队列时管道损坏