На основании вашего кода я предполагаю, что pipefd определен как:
int pipefd[2][2];
Теперь, когда вы делаете:
pipe(pipefd[0])
Это заполняет только pipefd[0][0]
и pipefd[0][1]
.
Итак, когда вы делаете:
# Bad descriptor
close(pipefd[1][1]);
вы ссылаетесь на случайный мусор (вы никогда не устанавливаете pipefd[1][0]
или pipefd[1][1]
).
Из показанного кода я не понимаю, почему вы не просто делаете:
int pipefd[2];
pipe(pipefd);