Завершает ли функция C execv () дочерний процесс? - PullRequest
1 голос
/ 02 марта 2011

Вот разбивка моего кода.

У меня есть программа, которая разветвляет ребенка (и регистрирует pid ребенка в файле), а затем делает свое дело. Ребенок становится любой программой, которую программист удостоил argv. Когда дочерний процесс завершает выполнение, он посылает сигнал (используя SIGUSR1) обратно родительским процессам, чтобы родитель знал, как удалить дочерний элемент из файла. Родитель должен остановить секунду, подтвердить удаленную запись, обновив ее таблицу, и продолжить с того места, где он остановился.

pid = fork();
switch(pid){
case -1:{
    exit(1);
}

case 0 :{
    (*table[numP-1]).pid = getpid(); //Global that stores pids
    add();                             //saves table into a text file 
    freeT(table);                  //Frees table 
    execv(argv[3], &argv[4]);          //Executes new program with argv 
    printf("finished execution\n");  
    del(getpid());                     //Erases pid from file 
    refreshReq();                      //Sends SIGUSR1 to parent
    return 0;
}
default:{
    ... //Does its own thing
}
}

Проблема в том, что после того, как execv успешно запускается и заканчивается (оператор printf до возврата 0 дает мне знать), я не вижу остальных команд в выполняемом операторе switch. Мне интересно, есть ли в execv команда, подобная ^ C, которая убивает дочернего элемента при завершении и, следовательно, никогда не завершает остальные команды. Я заглянул в справочные страницы, но не нашел ничего полезного по этому вопросу.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 02 марта 2011

execv заменяет текущую исполняемую программу другой.Он не восстанавливает старую программу, как только эта новая программа завершена, поэтому он задокументирован «в случае успеха, execv не возвращает».

Итак, вы должны увидеть ваше сообщение «завершено выполнение» тогда и только тогда, когда execv не удается.

2 голосов
/ 02 марта 2011

execv заменяет текущий процесс новым.Чтобы создать новый процесс, вы можете использовать, например, system(), popen() или комбинацию fork() и exec()

.
1 голос
/ 02 марта 2011

Другие люди уже объяснили, что делают execv и подобные функции, и почему следующая строка кода никогда не выполняется. Следующий логический вопрос таков: как родитель должен определить, что ребенок сделан?

В простых случаях, когда родитель не должен делать абсолютно ничего во время бега ребенка, просто используйте system вместо fork и exec.

Или, если родитель сделает что-то еще до того, как ребенок выйдет, это ключевые моменты:

  • Когда ребенок выйдет, родитель получит SIGCHLD. Обработчик по умолчанию для SIGCHLD игнорируется. Если вы хотите перехватить этот сигнал, установите обработчик перед вызовом fork.
  • После того, как ребенок вышел, родитель должен позвонить waitpid, чтобы очистить ребенка и выяснить, каков был его статус выхода.
  • Родитель также может позвонить wait или waitpid в режиме блокировки, чтобы дождаться выхода ребенка.
  • Родитель также может позвонить по номеру waitpid в неблокирующем режиме, чтобы узнать, вышел ли ребенок еще.
0 голосов
/ 02 марта 2011

Чего ты ожидал? Это то, что делает execv. Пожалуйста, прочитайте документацию , в которой написано:

Семейство функций exec () заменяет текущий образ процесса новым образом процесса.

Возможно, вы просили system или что-то еще, чтобы попросить среду создать новый процесс в дополнение к к текущему. Или .. разве это не то, чего вы уже достигли с помощью fork? Трудно увидеть, чего ты хочешь достичь здесь.

...