2013-03-03 32 views
0

我需要一些帮助。我需要执行所有三个execlp()一旦我运行该程序,但发生的是只有情况0执行。我改变pid为1和case1得到执行等等。试图把它放在for循环,但不起作用。我改变了休息,但仍然一样 - 只执行一个进程。有什么建议么?多个execlp不工作

主(){

pid_t pid; 
pid= fork(); 
int i; 

if(pid==0){ 

    for (i=0; i<3; i++){ 
     switch (i){ 
      case 0: 
      execlp("/bin/cat", "cat", "wctrial.txt", NULL); 
      break; 

      case 1:  
      execlp("/bin/mkdir", "mkdir", "mydirectory", NULL); 
      break; 

      case 2: 
      execlp("/bin/wc", "wctrial.txt", NULL); 
      break; 
     } 
    } 


}else{ 
    wait(NULL); 
    printf("Child process completed!"); 
    exit(0); 
} 

}

回答

6

根据man execlp

exec()系列函数替换用新的处理图像的当前过程映像。

(重点是我的)

因此,一旦你成功调用execlp,该过程不会重新执行旧代码。

case 0: 
    execlp("/bin/cat", "cat", "wctrial.txt", NULL); 
    /* shouldn't go here */ 
    break; 

如果要执行这三个程序,可以创建三个进程。例如(循环展开):

pid_t son; 

son = fork(); 

if (son == -1) /* report */ 
else if (son == 0) execlp("/bin/cat", "cat", "wctrial.txt", NULL); 
else wait(NULL); 

son = fork(); 

if (son == -1) /* report */ 
else if (son == 0) execlp("/bin/mkdir", "mkdir", "mydirectory", NULL); 
else wait(NULL); 

/* ... */ 
+0

即时通讯新手在这里。如果我要创建三个流程,我该如何执行所有这些流程?你能告诉我吗?请! – Dale 2013-03-03 17:14:33

+0

@戴尔:看我的编辑。虽然它看起来很丑,但它应该起作用。 – md5 2013-03-03 17:21:07

+0

现在我明白了!非常感谢! – Dale 2013-03-03 17:26:49

0

另请参见基里连科的答案。解决方案是使用system(..)而不是execlp(..)

手册页here

+0

我也使用过系统,而不是execlp,但仍然发生同样的事情。 – Dale 2013-03-03 17:18:54