2015-09-26 4 views
-1

В этой программе я пытаюсь использовать функции fork() для создания 6 дочерних процессов и выполнения функций executenode(), но я чувствую в моем выходе есть что-то не так! Что случилось с моим кодом или системными вызовами? У меня есть программа, как этотможет кто-то сказать мне, что случилось с моей программой, используя системные вызовы fork() (программирование C)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 



int executionnode(int i); 

int main(){ 
pid_t childpid; 
    int i; 
    int row=6; 
    for(i=0;i<row;i++) 
    { childpid=fork(); 
     if(childpid==0) 
      continue; 
     else if (childpid>0) 
      executionnode(i); 

     else { 
      perror("something wrong"); 
      exit(1); 
      } 
     } 


} 


int executionnode(int i){ 
    sleep(i); 
    printf("hello, I am process:%ld\n",(long)getpid()); 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    execvp("echo", execArgs); 

} 

Everytime когда я запускаю эту программу, выход всегда, как это в моем Linux терминале:

/* 
hello, I am process:3226 
Hello, World! 
[email protected]:~/Desktop/pa1-release$ hello, I am process:3227 
Hello, World! 
hello, I am process:3228 
Hello, World! 
hello, I am process:3229 
Hello, World! 
hello, I am process:3230 
Hello, World! 
hello, I am process:3231 
Hello, World! 
*/ 

Я считаю, мой выход даже не закончил, что означает, что выполнение моей программы еще не завершено, но [email protected]:~/Desktop/pa1-release$ появился в терминале раньше времени.
Что случилось с моим кодом или системными вызовами?
Может кто-нибудь помочь мне объяснить это? Я имею в виду, почему [email protected]:~/Desktop/pa1-release$ появился до того, как программа закончила свое исполнение?
спасибо!

+0

Возможный дубликат [Ожидание execvp в основном] (http://stackoverflow.com/questions/3637973/waiting-for-execvp-in-main) – wimh

ответ

3

Родитель работает очень быстро, разветвляя детей. Затем он завершает работу, а оболочка печатает приглашение. Затем другие дети запускают и печатают данные. Похоже, что один ребенок может печатать до того, как оболочка напечатает приглашение, а другие - нет. Если вы хотите, чтобы родитель подождал, пока дети закончатся, есть функция, удобно называемая wait, которая сделает это.

+0

Следует отметить, что 'wait' будет только бесплатным зомби. Для того, чтобы все дочерние процессы заканчивались первым, просмотрите «waitpid» и используйте его для каждого созданного дочернего процесса. –

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