我试图理解exec是如何工作的,现在我仍然坚持这个例子。如果不删除提供的文本中的任何内容,请编辑以下函数,以便程序将命令应用于收到的所有参数以及如何完成此操作?谢谢! :)
int main(int argc, char** argv[]){
for(int i=1; i<argc; i++){
execlp("cat", "cat", argv[i]);
printf("Error\n");
exit(1);
}
return 0;
}
答案 0 :(得分:2)
execlp()将替换当前进程。
注意:execlp()
的最后一个参数必须为NULL
为了避免覆盖当前进程,第一步是调用fork()
来创建子进程。
自然允许fork()`
中的每个可能的返回值然后父进程需要等待子进程退出。
否则,每个运行cat
的多个子进程将竞争在终端上显示其输出。
因此父母需要在创建下一个子进程之前等待每个孩子完成
将以上所有结果应用于:
#include <sys/types.h>
#include <sys/wait.h> // waitpid()
#include <unistd.h> // fork()
#include <stdio.h> // perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
int main(int argc, char* argv[]) // single `*` when using `[]`
{
pid_t pid;
for(int i=1; i<argc; i++)
{
switch( pid = fork() )
{
case -1:
// handle error
perror( "fork failed");
exit( EXIT_FAILURE );
break;
case 0: // the child
execlp("cat", "cat", argv[i], NULL);
perror("execlp failed");
exit( EXIT_FAILURE );
break;
default:
// parent
// wait for child to exit
waitpid( pid, NULL, 0);
break;
} // end switch
} // end for
return 0;
} // end function: main