URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 121
[ Назад ]

Исходное сообщение
"Как сделать что бы демон запускал другую програмку?"

Отправлено Сергей , 17-Авг-01 14:10 
Проблемма вот в чем :
нужно что бы демон во время своей работы
запускал другое приложение, ждал когда оно отработает. Но если просто написать system("...");
то ничего не запускается ... говорят что нужно порождать fork'oм дочерний процесс и тот уже в свою очередь ..? немогли бы мне обьяснить зачем это надо ? и как правильно это сделать.
спасибо.

Содержание

Сообщения в этом обсуждении
"RE: Как сделать что бы демон запускал другую програмку?"
Отправлено ivo , 17-Авг-01 21:31 
system сам делает fork,exec и ждет
Скорее всего ошибка в аргументе



"RE: Как сделать что бы демон запускал другую програмку?"
Отправлено XMan , 18-Авг-01 04:29 
Незнаю, как system, но могу рассказать, как делать через exec.
Итак представим такую схему:

A1(fork) -> A1 (wait или waitpid)->A1 ...
|-------> A2 -> exec(...)->exit().

Пояснение:
Процесс A1 порождает процесс A2, который вызывает exec. При вызове тело процесса A2 заменяется телом программы, вызванной в exec (потому и делается fork). В это время процесс A1 уходит в режим ожидания завершения потомка A2 (wait) или делает что-то, периодически проверяя, завершился потомок A2 или нет (waitpid). Когда потомок завершается , в памяти остается только процесс A1.
wait и waitpid нужны для того, чтобы у тебя zombie-процессов не висело.
Кстати, маленькая хитрость - для вызова заранее неизвестной программы, да еще и с параметрами, делается вызов, например, /bin/sh, которому в качестве параметров передается строка с программой и ее параметрами.

Вобщем, получается что-то типа:

...
char program_name[1024];
bzero(&program_name,1024);
fgets(&program_name,1023,stdin);
int pid=fork();
if (pid > 0) {
  // родитель
  wait(pid);
} else if (pid == 0) {
  // потомок
  exec("/bin/sh","-c",program_name,0);
  // если мы попадаем сюда, то ошибка при выполнении exec
  perror("exec");
  // завершение потомка
  exit(0);
} else
  // ошибка при выполнении fork
  perror("fork");
...