0

我需要一些帮助。运行程序后,我需要执行所有三个 execlp() 但发生的情况是只有 case 0 被执行。我将 pid 更改为 1 并且 case1 被执行,依此类推。尝试将其放入 for 循环但不起作用。我更改了 break 以继续但仍然相同 - 只执行一个进程。有什么建议么?

主要的(){

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);
}

}

4

2 回答 2

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);

/* ... */
于 2013-03-03T17:01:53.190 回答
0

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

手册页在这里

于 2013-03-03T17:08:52.353 回答