2014-11-10 2 views
-1

У меня проблемы с этим простым упражнением. Вот код:C++ - fork() и его возвращаемое значение

int main(int argc, char** argv) { 
pid_t pid1,pid2,pid3; 
int a=5,b=4,c=3,retval,retval2; 
pid1=fork(); 
if(pid1==0){ 
    pid3=fork(); 
    if(pid3==0) 
     exit(a); 
    else if(pid3>0){ 
     waitpid(pid2,&retval2,0); 
     cout<<WEXITSTATUS(retval2); 
    } 
} 
else if(pid1>0){ 
    pid2=fork(); 
    if(pid2==0){ 
     cout<<"CIAO"; 
     exit(b); 
    } 
    else if(pid2>0){ 
     waitpid(pid3,&retval,0); 
     cout<<WEXITSTATUS(retval); 
    } 
} 

return 0; } 

Как вы можете видеть, это не так сложно. Все, что я хочу сделать, это pid2 (отец), чтобы напечатать возвращаемое значение pid3 (son) и pid3 (отец), чтобы напечатать возвращаемое значение pid2 (son). Любой совет? Я был бы очень признателен.

+1

Ряд вещей не правы: переменные будут скопированы в их текущем состоянии, но обновления этих переменных не будет распространяться через (например, изменения в 'pid2' не будут видны другим процессам, поэтому ваш' wait (pid2) 'не будет работать. Кроме того, даже если бы это сработало, это было бы условие гонки в любом случае. – slugonamission

ответ

1

Из-за первой вилки (той, которая устанавливает pid1), вторая вилка работает в разных процессах. В ветке pid1==0pid2 никогда не получает значение, потому что этот процесс никогда не назначает его. Аналогично, в ветке pid1>0pid3 никогда не получает значение.

Похоже, вы ожидаете, что два процесса будут иметь один и тот же набор переменных, но это не работает. Викинг создает два независимых процесса, каждый из которых имеет свою собственную копию всех своих переменных.

+0

И как я должен продолжайте? Я должен использовать только fork () и wait() (или waitpid()). –

+0

Непонятно, как вы должны действовать, потому что неясно, чего вы на самом деле пытаетесь достичь. Почему ваши два процесса должны знать о детях друг друга? Процесс не может «ждать» для процесса, который не является его собственным ребенком. – Wyzard

0

В вашей программе, ПИД1 и PID3 дети исходного процесса (назовем его pid0), ПИД2 является дочерним ПИД1.

Переменные pid1, pid2 и т. Д. Обновляются только в определенных процессах и оставлены унифицированными в других. Ожидание pid3 в любом другом процессе, чем pid0, например, не имеет смысла, потому что другие процессы не будут правильно установлены pid3. Кроме того, ожидание процесса, который не является дочерним элементом текущего процесса, не работает.

Кроме того, syscall wait принимает указатель в качестве его параметра для возвращаемого значения возвращаемого дочернего процесса. Неверное значение wait(pid2).

Теперь, чтобы получить результат, который вы хотите, вы должны будете установить какой-то канал связи между ПИД1 и pid0, так что они могут передавать друг другу код возврата их соответствующего ребенка. A pipe созданный в pid0 может сделать трюк.

ссылки системных вызовов:

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