我有一个关于使用execvp()的问题,对于以下函数,如果我在子进程中并且execvp()函数执行成功(根据手册页,它将不会返回),如果else {}之外的脚本将继续工作,这意味着如果execCmd()函数将返回任何值?
int execCmd(char* args[10]) {
pid_t pid = fork();
if (pid < 0) {
exit(1);
} else if (pid > 0) { // parent process
/* do something */
} else {
if (execvp(*args, args) < 0) {
printf("Execution Failed!");
exit(1);
}
}
return 0;
}
提前致谢!
答案 0 :(得分:1)
如果execvp
成功,则该过程开始执行指定的程序。
Parent Process Child Process
------------------- -------------------
fork()
pid_t pid = ...; pid_t pid = ...;
pid < 0 pid < 0
pid > 0 pid > 0
/* do something */ execvp(*args, args)
return 0; [main of new program]
你的程序本可以写成
int execCmd(char** args) {
pid_t pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
}
if (pid == 0) {
execvp(*args, args);
perror("execvp");
_exit(1);
}
/* ... Do something in parent ... */
return 0;
}
此外,您可能希望等待孩子完成,返回pid
或让孩子自动收割(通过忽略SIGCHILD)。
答案 1 :(得分:0)
一般来说,代码不应该执行misc语句;
代码应该只需要测试一次fork()
的调用结果。
请注意,无需在execvp()
代码块中将调用包装到if()
父进程应该在退出之前等待子进程完成。
发生错误时,应通过调用stderr
向fprintf( stderr, "...\n" )
输出错误消息但是,当错误来自系统函数时,系统认为发生错误的原因也应该是输出到stderr
。实现此目的的一种简单方法是调用perror()
为了便于阅读和理解:单独的代码块(for
if
else
while
do...while
switch
case
{ {1}})通过一个空白行。
调用default
的首选代码逻辑是:
fork()