char buffer[200];
read(((int*)pipe1)[0], buffer, strlen(buffer));
Вы звоните strlen
в неинициализированном буфере.Это может привести к краху вашей программы.Вместо этого вам повезло, и все, что он сделал, это велел read
прочитать ноль байтов, поэтому read
вернулся без каких-либо действий.
Что вы действительно хотите, так это
ssize_t nread = read(((int *)pipe1)[0], buffer, sizeof buffer - 1);
if (nread < 0) {
perror("read");
return 0;
}
buffer[nread] = '\0';
Чтоread
хочет знать, сколько пробелов вы даете ему для чтения, а не длину какой-либо строки, которая может или не может быть уже в этом пространстве.Это sizeof buffer
, минус один, поэтому у нас всегда есть место для добавления ограничителя строки.
Правильно использовать strlen
при при записи , потому что вы хотите записать только фактическую строку,не любой мусор, который мог бы быть за концом последовательности;но тогда write
не записывает терминатор строки в канал, поэтому read
не читает единицу, поэтому вы должны добавить его вручную.И, конечно же, всегда проверяйте наличие ошибок.
Кроме того, имейте в виду, что потоки одновременно запускают .Даже после исправления этой ошибки, write
может уже произойти к тому моменту, когда поток чтения вызывает read
, а если нет, то, вероятно, это произойдет очень скоро.Если вы хотите наблюдать за тем, как поток чтения действительно блокируется в read
, вам необходимо отложить вызов до 1030 *.