2015-09-27 54 views
0

我有以下的程序,當我運行該程序,我覺得真的很困惑的是,爲什麼我的程序沒有EXCUTE爲什麼程序在這個C編程或unix編程(execvp()系統調用)中沒有執行一些句子?

int num=i; 
     printf("it is No.%d !",num); 
     printf("hello , I will excute execvp!"); 

我的程序基本上創建6個進程EXCUTE executionbode()函數,然後用execvp超載原始程序。但是,每次運行程序時,字符串「你好,我將執行execvp」永遠不會顯示出來!我還認爲上面的這三句話在運行程序中也沒有執行?有人可以告訴我爲什麼嗎?下面是我的程序

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include "makeargv.h" 
#include "redirection.h" 
#include <sys/wait.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()); 
    wait(NULL); 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    int num=i; 
    printf("it is No.%d !",num); 
    printf("hello , I will excute execvp!"); 
    execvp("echo", execArgs); 

} 

有人能告訴我爲什麼嗎?以及如何解決它?我覺得這真的很奇怪?這是因爲execvp()函數嗎?我剛開始學習操作系統,所以我非常困惑!感謝你們對我的幫助!

+0

這一行:'wait(NULL);'將永遠掛起,因爲這個孩子沒有孩子等。 – user3629249

+2

你似乎對函數的返回值有些疑惑:'fork()'。發佈的代碼有孩子執行fork和父執行'execvp()'這是你似乎想要做的後退。用發佈的代碼 – user3629249

+0

,會有很多孩子的孩子的孩子。等等。一般情況下,只有父類應該循環,調用fork()的時候執行execvp() – user3629249

回答

0

由於user3629249表示您有一些困惑。你會得到許多孩子的孩子......而等待(NULL)是無用的:)。

我用這個結構在我的操作系統主題練習中獲得了你的目標。

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#define N 5 

int main(int argc, char const *argv[]) 
{ 
    pid_t pid,pids[N]; 
    int i, num_pids = 0; 
    int state = 0; 
    int prior[]={1,3,5,2,4}; 

    pid_t parent_pid = getpid(); 
    printf("Parent pid is %i\n",father_pid); 

    // This for loop is the key 
    for (i = 0; i < N && getppid() != parent_pid; i++) 
    { 
    if ((pid = fork()) < 0) 
    { 
     printf ("fork error\n"); 
     exit(-1); 
    } 
    pids[num_pids++] = pid; 
    } 

    if (pid == 0) // Child processes 
    { 
    printf("I am the child %i\n",getpid()); 
    } 
    else // Parent process 
    { 
    for (i = 0; i < N; i++) 
    { 
     int pid_index = prior[i]-1; // Array starts with 0 
     pid = waitpid(pids[pid_index]); 
     printf("Children %i ended\n",pids[indice_pid]); 
     printf("%i alive children\n",N-1-i); 
    } 
    } 

    return 0; 
} 

這種結構的作品,因爲你救父母在parent_pid變量PID和比較每個進程的PID與getppid父()。如果此pid與parent_pid不同,則此過程是父級。在另一種情況下,這個過程是一個孩子,所以它必須停止(這些過程不必分叉)。用這種方法,你只能得到你需要的叉子。

其餘的代碼是相同的:Pid == 0是子進程,任何其他都是父進程。你可以在子進程塊中調用executionnode(int i)(記住,pid == 0 !!!你有一個錯誤)。我認爲每個電話中我的變量都應該有正確的值。

祝你好運!