Хорошо, я делаю трубку, чтобы связаться с детьми моего процесса. Во-первых, я попытался сделать защиту своих fds, поэтому я могу получить к ним доступ позже для некоторых вещей, но почему-то это просто застревает при дублировании fds.
int pipeFd [2];
int pid;
pipe (pipeFd);
//Safeguard of the Original FDs
int fdSG [2];
perror ("fdsg create");
dup2 (1, fdSG [1]);
perror ("dup2 sfg1");
dup2 (0, fdSG [0]);
perror ("dup2 sfg2");
dup2 (pipeFd [1], 1);
Программа застряла в последней инструкции, показанной здесь.
Вывод терминала следующий:
fdsg create: Success
dup2 sfg1: Bad file descriptor
dup2 sfg2: Bad file descriptor
dup2: Bad file descriptor
Кто-нибудь из вас знает, почему это происходит?
Из кода, который вы показали, вы не инициализировали fdSG
. Это неверно, аргументы dup2
оба должны быть действительными файловыми дескрипторами.
Поскольку вы, похоже, хотите скопировать fd вместо замены существующего, вместо этого вы должны использовать dup
для этих резервных копий, он выбирает бесплатный fd
и использует это. (В качестве альтернативы вы можете включить fdSG
в действительные fds тоже).
С manpage:
dup()
использует неиспользуемый дескриптор с наименьшим номером для нового дескриптора.
perror
вызыватьperror
если на самом деле не было ошибки. (Вы должны проверить возвращаемые значения)