私はおよそ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);
}
そして、テストコードの結果は、(あなたが理解できない場合は、単に結果で中国語を無視する)絵で示されている: 「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の実行と復帰にどのように有効でないかを知っていますか?
私はちょうどテストしました、あなたは正しいです!私は後でお好きな答えをあなたにマークします、ありがとうございます。 – cong
私はexecl returnと_exit(127)が実行されたと思っていましたが、あなたの答えに感謝します。 – cong