LINUX.ORG.RU

pipe()+exec()

 , , , ,


1

2

Помогите, пожалуйста, разобраться. Есть программа, где используются вызовы fork() и pipe(). В процессе-родителе записывается информация в дескриптор fd[1], а в процессе-ребенке читается дескриптор fd[0] и выводятся эти данные на экран. Все это написано в одном файле. А у меня задача, чтобы в процессе-ребенке вызвался вызов exec() и оттуда как-то прочиталась информация, которую мы записали в процессе-родителе в дескрипторе fd[1]. Проблема в том, что в exec() мы же передаем файл, а в этом файле я не могу получить доступ к тем дескрипторам, которые были созданы в первоначальном файле. Помогите, разобраться с этим заданием. Много времени уже не могу разобраться. Вот собственно код, который нужно поменять:

#include <sys/types.h> #include <unistd.h> #include <stdio.h>

int main(){

int fd[2], result;

size_t size;

char resstring[14];

if(pipe(fd) < 0){

printf(«Can\'t create pipe\n»);

exit(-1);

}

result = fork();

if(result <0){ //ошибка создания

printf(«Can\'t fork child\n»);

exit(-1);

} else

if (result > 0) { //родительский процесс

close(fd[0]);

size = write(fd[1], «Hello, world!», 14)

if(size != 14){

printf(«Can\'t write all string\n»);

exit(-1);

}

close(fd[1]);

printf(«Parent exit\n»);

} else { //процесс ребенок close(fd[1]);

size = read(fd[0], resstring, 14);

if(size < 0){

printf(«Can\'t read string\n»);

exit(-1);

} printf(«%s\n»,resstring);

close(fd[0]);

}

return 0;

}

А вот задание: Модифицировать программу так, чтобы канал использовался для связи двух родственных процессов, исполняющих разные программы. Обратить внимание, на то, что процесс ребенок должен читать информацию из канала после замены его пользовательского контекста.

а в этом файле я не могу получить доступ к тем дескрипторам, которые были созданы в первоначальном файле

Можешь.

O_CLOEXEC придумали как раз, чтобы закрывать дескрипторы в момент вызова exec. Иначе они остаются открыты.

i-rinat ★★★★★ ()

А вот задание: Модифицировать программу так, чтобы канал использовался для связи двух родственных процессов, исполняющих разные программы.

Задание в том, что вам надо сделать два exec-а разных программ, где изначальная — мониторинг этого обмена? Тогда вам надо два pipe и два fork-а. А O_CLOEXEC тут вовсе не при чём. У pipe всё равно это выставить невозможно, а выставлять fcntl(O_CLOEXEC) всё равно не даст ничего более правильного по сравнению с close(), которые в указанном примере уже написаны и правильно.

vodz ★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Не могли бы подсказать, как это правильно оформить? Я понимаю, что задание, вроде бы, несложное, но до меня не доходит, что за чем должно идти, чтобы это все правильно работало. Не понимаю, какой код писать в главной программе, а какой в файле, который мы через exec() вызываем.

Roman456 ()
Ответ на: комментарий от Roman456

Не могли бы подсказать, как это правильно оформить?

Ну вы приведенный код откуда взяли? Вот туда в сына надо и вставить exec, смотря кто пишет, а кто читает, надо соответственно переназначать дескрипторы стандартных ввода/вывода на полученные от pipe.

а какой в файле

В каком таком файле?

vodz ★★★★ ()

Пайп остается живым после exec’а, как уже намекали, так что достаточно новому процессу в аргументах передать номер дескриптора и читать из него сколько влезет. Последний товарищ vodz просто не понял задания, судя по всему. Ну либо я тоже не понял.

anonymous ()
Ответ на: комментарий от anonymous

т.е. если сейчас после форка в чилде ты просто читаешь read(fd), то теперь нужно этот код перенести с другой файл, где свой main(argc, argv). И fd = atoi(argv[1]), потом read(fd).

А в паренте соответственно snprintf(buf, “%d”, fd) + exec(“child”, buf)

anonymous ()
Ответ на: комментарий от anonymous

Последний товарищ vodz просто не понял задания

Я задал вопрос и рассказал для одного типа понимания. Какие могут быть претензии?

Ну либо я тоже не понял.

В том то и проблема, что это судя по всему пересказ задания, и всё похоже бестолку.

vodz ★★★★ ()