Я написал простую программу, чтобы узнать, как писать сообщения на трубе в C, и при этом я нашел что-то довольно странное, что я не могу объяснить или понять, это код:Сообщение о трубе в 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. Любые разъяснения или исправления приветствуются.
Возможно, вы захотите вызвать 'read' в цикле и проверить возвращаемое значение, пока ничего больше не сможете прочитать. И/или установите MAXSIZE немного больше ... –
Цель вопроса заключалась в том, чтобы понять, в чем разница, которую делает +1 в strlen. Если чтение вызывается в цикле, число итераций (или написанных сообщений) должно было быть заранее известно, не так ли? – user1493813
Почему вы отказываетесь выполнять операцию чтения, если PID родителя меньше десяти? Я понимаю, что 'pid == 0' будет дочерним элементом fork, и вы никогда не получите' pid == 1', потому что это процесс init, но что особенного в pids '2',' 3', '4',' 5', '6',' 7', '8' и' 9'? –