3

execl() の概念を理解するための簡単なプログラムを作成しました。これが私のプログラムです

#include<stdio.h>
#include<unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    if(pid == 0)
    {
        execl("/bin/sh","sh","-c","ls -l *.c", NULL);
    }
}

実行すると、拡張子が「.c」のファイルの一覧が表示されます。しかし、子プロセスが終了せず、カーソルが点滅し続けているようです。

srico@ubuntu:~/Desktop/c$ -rw-rw-r-- 1 srico srico   84 Jun 30 08:30 cmdacc.c
-rw-rw-r-- 1 srico srico  138 Jul  4 11:08 execfun.c
-rw-rw-r-- 1 srico srico  343 Jul  4 10:27 execvp1.c
-rw-rw-r-- 1 srico srico  167 Jun 23 08:20 filechar.c
-rw-rw-r-- 1 srico srico  195 Jun 23 11:20 fileline.c
-rw-rw-r-- 1 srico srico  203 Jun 27 07:17 filestat.c
-rw-rw-r-- 1 srico srico  112 Jun 22 11:11 new.c
-rw-rw-r-- 1 srico srico  304 Jun 27 12:09 parchild1.c
-rw-rw-r-- 1 srico srico 1038 Jun 27 10:56 parchld.c

ctrl+c を使用してプロセスを手動で強制終了する必要があります。

^C
srico@ubuntu:~/Desktop/c$

間違いを修正するのを手伝ってください。

4

2 に答える 2

6

親プロセスが子プロセスより先に終了し、シェルは子プロセスが出力を書き込む前にプロンプ​​トを書き込みます。Control-c を押すと、子プロセスはすでに終了しており、代わりにシェルがプロンプトを書き換えます。Enter キーを押すと、同じ効果が得られます。

この問題を解決するには、次のwait関数を使用して、子プロセスが終了するまで親プロセスを待機させることができます。

if (pid == 0) {
    execl("/bin/sh", "sh", "-c", "ls -l *.c", NULL);
} else if (pid > 0) {
    wait(NULL); /* wait for child */
} else {
    /* it was not possible to create child process, so print error message */
    perror("fork failed");
}

複数の子プロセスを起動していて、特定の子プロセスの結果を待ちたい場合は、waitpidの代わりに使用しますが、この場合は単純waitにすることを好みます。wait

于 2013-07-04T06:31:13.473 に答える
3

親プロセスは子プロセスの完了を待つ必要があるため、waitpid()以下のように呼び出す必要があります。コードの残りの部分は、エラー処理を改善するためのものです。

int status;
pid = fork();
if (pid == 0)
{
    /* child process.  shell command execution. */
    execl("/bin/sh", "sh", "-c", "ls -l *.c", NULL);
    _exit(EXIT_FAILURE);
}
else if (pid < 0)
    /* The fork failed.*/
    status = -1;
else
    /* parent process.  Wait for child to complete.  */
    if (waitpid(pid, &status, 0) != pid)
        status = -1;
return status;
于 2013-07-04T06:28:57.920 に答える