2017-02-01 3 views
1
#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 

int main(int argc, char ** argv) 
{ 

    int pid; 
    int status; 
    pid = fork(); 

    if (pid < 0) 
    { 
     printf("Cannot create a child process"); 
     exit(1); 
    } 
    else if (pid == 0) 
    { 

     printf("I am the child process. %d \n", getpid()); 
     printf("The child process is done. \n"); 
     fflush(stdout); // it does not write immediately to a disk. 
     exit(0); 
    } 
    else 
    { 

     printf("I am the parent process.%d \n", getpid()); 
     sleep(5); // sleep does not works 
     pid = wait(&status); // want to wait until the child is complited 
     printf("The parent process is done. \n"); 
     fflush(stdout); // it does not write immediately to a disk. 
     exit(1); 
    } 
} 

Привет, ребята, я в настоящее время пытаюсь создать дочерний процесс. Однако пока что хорошо, что сейчас я пытаюсь выполнить сначала ребенка и распечатать его, и всегда печатать сообщение «Последний родительский процесс».Выполнение дочернего процесса перед родителем в C

I am the parent process.28847 
I am the child process. 28848 
The child process is done. 
The parent process is done. 

В настоящее время печатает это:

I am the parent process.28847 
The parent process is done. 
I am the child process. 28848 
The child process is done. 

Это мой первый раз, используя разветвление, так что я не очень уверен в том, что я делаю, я пытался спать и ждать (& статуса) в попробуйте подождать, пока завершится дочерний процесс, а затем выполните родительский элемент, но что-то не работает.

P.S. извините за плохой макет, кулак с использованием stackoverflow.

+4

Вы должны, вероятно, использовать [ 'ожидание()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html) или [ 'waitpid()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html). –

+3

В вашем коде «Родительский процесс завершен» будет печататься как последний раз (поскольку вы используете 'wait()'). – usr

+0

Большое спасибо, мне удалось это исправить. Я собираюсь проверить мьютекс и семафоры и как его улучшить. –

ответ

1

Попробуйте waitpid (-1, NULL, 0); или ждать (NULL); Это приведет к блокировке родителя до завершения всех дочерних процессов. Если это работает, вам не нужно использовать сон.

Незначительные изменения в код:

else 
{ 
    int status =0; 
    printf("I am the parent process.%d \n", getpid()); 
    status= waitpid(-1, NULL, 0); // want to wait until the child is complete 
    //Also check if child process terminated properly 
    if(status==0) 
    { 
     printf("Child process terminated properly"); 
    } 
    else 
    { 
     printf("Child process terminated with error"); 
    } 

    printf("The parent process is done. \n"); 

    fflush(stdout); // it does not write immediately to a disk. 

    exit(1); 
} 
Смежные вопросы