2017-09-06 98 views
0

我读到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); 
} 

和测试代码的结果由图所示(忽略了中国的结果,如果你无法理解): test code result 我不知道为什么会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无效并执行并返回?

回答

1

sh -c nosuchcommand本身返回127.这是return codes with a special meaning之一。

所以我不认为你在这种情况下看到execl实际返回。

+0

我刚测试过,你是对的!我会在后面标记你回答最喜欢的,非常感谢。 – cong

+0

我曾经认为execl返回和_exit(127)被执行,谢谢你的回答。 – cong

1

它不“知道”。它只是执行你告诉它的内容。 /bin/sh然后报告它找不到它,之后/bin/sh以非零退出码退出,在这种情况下为127

另请注意,您不能依赖它返回确切的返回值,因为这是特定于shell的。一些shell(包括某些操作系统上的/bin/sh)将返回1

+0

我以前认为execl返回和_exit(127)被执行,谢谢你的回答,但以下回答在你之前,所以我会标记他的最爱,对不起。 – cong