我读到APUE 3rd,8.13,系统功能,我就看见一个版本的系统功能,实现无信号handling.Code是象下面这样:execl在Linux中如何处理“/ bin/sh”?
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
int system(const char *cmdstring) /* version without signal handling */
{
pid_t pid;
int status;
if (cmdstring == NULL)
return(1); /* always a command processor with UNIX */
if ((pid = fork()) < 0) {
status = -1; /* probably out of processes */
} else if (pid == 0) { /* child */
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
_exit(127); /* execl error */
} else { /* parent */
while (waitpid(pid, &status, 0) < 0) {
if (errno != EINTR) {
status = -1; /* error other than EINTR from waitpid() */
break;
}
}
}
return(status);
}
而且代码用于测试系统功能的这个版本是一样如下:
int main(void)
{
int status;
if ((status = system("date")) < 0)
err_sys("system() error");
pr_exit(status);
if ((status = system("nosuchcommand")) < 0)
err_sys("system() error");
pr_exit(status);
if ((status = system("who; exit 44")) < 0)
err_sys("system() error");
pr_exit(status);
exit(0);
}
和测试代码的结果由图所示(忽略了中国的结果,如果你无法理解): 我不知道为什么会EXECL回报,如果“nosuchcommand” ,这是无效的/ bin/sh被赋予/ bin/sh。在我看来,execl只是替换当前进程的代码,然后从入口点运行,即使“nosuchcommand”对于/ bin/sh无效,它与execl和/ bin/sh无关。那么,execl如何知道“nosuchcommand”对于/ bin/sh执行并返回是无效的呢?在执行/ bin/sh之前,通过检查给/ bin/sh的命令,execl可以对/ bin/sh进行不同的处理,以便事先知道给/ bin/sh的无效参数?我知道execl不会以不同的方式处理/ bin/sh,因此,execl如何知道“nosuchcommand”对于/ bin/sh无效并执行并返回?
我刚测试过,你是对的!我会在后面标记你回答最喜欢的,非常感谢。 – cong
我曾经认为execl返回和_exit(127)被执行,谢谢你的回答。 – cong