Я столкнулся с подобной ситуацией. Моей целью было отправить некоторую информацию из дочернего процесса, который выполняется в xterm. Как также сообщалось ранее, я не смог использовать dup2. Обходной путь для этого состоит в том, чтобы передать fd в новый двоичный файл как аргументы xterm.
Предлагаемый подход (без проверки ошибок на краткость):
if (childpid == 0)
{
/* child closes read*/
close(pipeFD[0]);
char writeFD[10]; // do consider space for '\0'
/* Extract the write fd and put it in a char buffer
make compatible as per execlp args */
sprintf(writeFD, "%d", pipeFD[1]);
/* just pass the writeFD as an arg */
execlp("xterm", "xterm", "-e", "./binary", writeFD, (char *) 0))
}
else
{
/* parent closes write */
close(pipeFD[1]);
if((bytesRead = read(pipeFD[0], buf, SIZE)) != -1)
{
printf("Recieved %s\n", buf);
close(pipeFD[0]);
}
}
В дочернем процессе, который выполняется в xterm, извлеките fd
main(int argc, char** argv) {
int fd = atoi(argv[1]);
write(fd, buf,sizeof(buf));
}
Я не знаю, почему dup2 не работает с xterm, но этот обходной путь отвечает требованию.