2016-09-12 13 views
-1

ネットでこの例を発見し、この行がなぜこの行は印刷されませんか? (C++スレッド)

#include<stdlib.h> 
#include<unistd.h> 

int main() 
{ 
    pid_t return_value; 

    printf("Forking process\n"); 
    return_value=fork(); 
    printf("The process id is %d 
     and return value is %d\n", 
     getpid(), return_value); 
    execl("/bin/ls/","ls","-l",NULL); 
    printf("This line is not printed\n"); 
} 
+2

質問する前に、関係するすべての機能のドキュメントを読んでいますか? 'execl'と同じように?ところで、 'fork'はスレッドではなくプロセスを生成します。 – Angew

答えて

5

成功execlを印刷されない理由を見つけることができませんが、決して戻らない、man pageを参照してください。

exec()関数は、エラーが発生した場合のみ返します。

代わりに、ホストプロセスは、あなたがexec ING何であるかによって置き換えられ、この場合には、lsプロセスイメージ:

機能のEXEC()家族が新しいと、現在のプロセスイメージを置き換えますプロセス画像。

このようにして、プログラムは最後のprintfステートメントに達する前にメモリに置き換えられ、実行されません。

1

exec*()これらの機能は、の返品不可の特別な意味を持っています。です。その機能の典型的な実装は、現在のプロセスのモジュールを、現在のプロセスの中で新しいプログラムの開始と事実上同じにします。あなたの場合、新しいプログラムは/bin/lsです。 execl()の間に、すべての以前のイメージがプロセスからアンロードされ、次に/bin/lsとそのすべての依存関係がロードされ、コントロールが/bin/lsのエントリーポイントに渡されます。このエントリーポイントはmain()関数を呼び出します。

execl()の後に制御を戻す場所がないため、現在のプロセスのアドレス空間にこれ以上呼び出していないモジュールが存在します。

関連する問題