2017-09-06 5 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 「nosuchcommand」場合のリターンをexeclのだろう、なぜ私が疑問に思います、これは有効ではありません/ bin/shは、/ bin/shに与えられます。私の視点では、execlは現在のプロセスのコードを置き換えて、 "nosuchcommand"が/ bin/shには有効ではないにもかかわらず、エントリポイントから実行するだけで、execlではなく/ bin/shとは関係ありません。だから、execlが "nosuchcommand"が/ bin/shが実行して復帰するのに有効でないことを知る方法は? execlは/ bin/shを実行する前に/ bin/shに与えられたコマンドをチェックして/ bin/shを別の方法で扱いますので、あらかじめ/ bin/shに与えられた無効な引数を知ることができますか?私はexeclが/ bin/shを別の方法で扱わないことを知っているので、execlは "nosuchcommand"が/ bin/shの実行と復帰にどのように有効でないかを知っていますか?

答えて

1

sh -c nosuchcommand自体は127を返します。それはreturn codes with a special meaningの1つです。

私はこのケースでexeclが実際に復帰しているのを見ているとは思いません。

+0

私はちょうどテストしました、あなたは正しいです!私は後でお好きな答えをあなたにマークします、ありがとうございます。 – cong

+0

私はexecl returnと_exit(127)が実行されたと思っていましたが、あなたの答えに感謝します。 – cong

1

「認識」していません。それは単にあなたがそれを伝えることを実行するだけです。 /bin/shはそれが見つからないと報告します。その後、/bin/shはゼロ以外の終了コードで終了します。この場合は127です。

正確に127をシェル固有のものとして返すことはできません。一部のシェル(一部のOSでは/bin/shを含む)は、代わりに1を返します。

+0

私はexecl returnと_exit(127)が実行されたと思っていましたが、あなたの答えはありがたいですが、次の答えはあなたの前にあるので、私は彼のお気に入りをマークします。 – cong

関連する問題