我写了一个简单的程序来学习如何在 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。欢迎任何澄清或更正。