2010-09-03 2 views
0
int main() 
{ 
    ... 
    if(!fork()) 
     { 
      execvp(cmdName,cmdParam); 
     } 
    printf("In main()..."); 
return(0); 
} 
  1. Предполагая, что я правильно передал аргументы cmdParam cmdName &, как я жду этот процесс, созданный execvp до конца, прежде чем возобновить выполнение основной()?
  2. Выполняет ли execvp() процесс, являющийся потомком нового процесса fork() ed?
+0

Это nitpicky, но «Возобновление main() ...» является немного неправильным. Ваш родительский процесс никогда не выполнял какой-либо код внутри оператора if. –

+0

Я согласен, отредактировал эту часть сейчас – 2010-09-03 17:27:47

ответ

3
  1. В родительском процессе, fork возвращает PID дочернего процесса, так что вы можете хранить, что в переменной, а затем использовать waitpid ждать дочерний процесс завершается.

  2. Не совсем - новый дочерний процесс, созданный fork, является дубликатом родителя, а execvp затем заменяет его образ процесса новым изображением. Фактически вы изначально имеете две «копии» родителя, одна из которых затем «становится» новой программой.

+0

, а значит, «новая программа» является дочерним элементом родителя или имеет какой-то другой процесс в качестве родителя? – 2010-09-03 17:27:05

+0

@crypto: от http://www.opengroup.org/onlinepubs/000095399/functions/fork.html: «У дочернего процесса должен быть другой идентификатор родительского процесса, который должен быть идентификатором процесса вызывающего процесса». Затем 'execvp' заменяет образ процесса, но не меняет метаданные процесса. –

+1

@crypto: Первый. Если вы сделаете это в процессе 1000, одна из полученных вилок будет по-прежнему обрабатываться 1000 с исходным родителем, а один будет другим процессом, может быть, 1001, с 1000 в качестве родителя.Помимо этого, и что означает 'fork', процессы одинаковы. Затем 'execvp' изменяет процесс 1001. –

1

Вы должны сохранить возвращаемое значение fork(), который возвращает другое значение для каждого исполняемого файла (0, если вы ребенок PID, если вы являетесь родителем), а затем вам нужно сделать waitpid

3

Для вашего первого вопроса:

Использование waitpid (2), как это:

int pid = fork(); 
if (!pid) 
    { 
    execvp(cmdName, cmdParam); 
    } 
waitpid(pid, NULL, 0); 
printf("Resuming main()...\n"); 

Для второй части: все вызовы функций Exec взять процесс над (п один из них возвращается)

+0

Привет. Я бы поставил ** else ** в это, если, или, по крайней мере, ** выход ** внутри if. Приветствия –

+0

Привет! Нет необходимости, 'execvp' обгоняет текущий процесс. – terminus

+0

он только настигает, когда удастся. Не вредите написанием чего-то типа 'printf (« Panic! Не удалось запустить% s », cmdName); выход (1) '. Вообще-то, у меня появилось печальное видение такого сообщения. ;) –

2

Как уже отмечалось, вам необходимо сохранить значение вызова fork. Вы действительно должны использовать больше, чем если бы на развилке. Есть три случая:

  1. 0: вы дочерний процесс
  2. 0: вы родитель и получил ребенка PID назад

  3. -1: что-то ужасное произошло и fork failed

Вы действительно хотите знать о случае 3, это испортит весь ваш день. (также звонок руководителя)

int main() { 
    int pid = fork(); 
    if(-1 == pid) { 
    fprintf(stderr, "Big problems forking %s\n", strerror(errno); 
    exit(-1);//or whatever 
    } 
    else if (0 == pid) { 
    if (-1 == execvp(cmdName,cmdParam)) { 
     //like above, get some output about what happened 
    } 
    } 
    //no need to else here, execvp shouldn't return 
    // if it does you've taken care of it above 
    waitpid(pid, NULL, 0); 
    printf("Resuming main()..."); 
} 

возвращение (0); }

+0

should'nt дочерний процесс в части (pid == 0) имеет выход()? Я не хочу, чтобы ребенок печатал «Возобновить main() ...». – 2010-09-04 08:44:06

+0

Если execvp работал над тем, что код, который будет печатать возобновление main, исчезнет, ​​заменит cmdName. Если есть сбой, вы справитесь с ним разумным способом. –

Смежные вопросы