2015-09-27 17 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 !!!你有一个错误)。我认为每个电话中我的变量都应该有正确的值。

祝你好运!