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 より大きいメッセージを書き込むループがあります。その後、メッセージが読み取られてメインに出力されます。奇妙なことに、次のメッセージで使用する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 以下です。明確化や修正は大歓迎です。