我编写了一个简单的程序来学习如何用 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/