2016-10-28 5 views
1

私はスレッド、プロセス、execvなどにはとても新しいです。私は調査して、execvを実行すると呼び出しプロセスのスペースがかかることを発見しました。私はmainでスレッドを作成し、execvをスレッドの直後に呼び出すと(スレッドが終了する前ではなく、スレッドが作成された直後に)何が起こるのだろうかと思います。私はexecvがmainを置き換えることは知っていますが、これはスレッドを置き換えるか、スレッドが正常に実行して完了することを意味しますか?スレッドを作成した後でexecvを呼び出す

小さな例私は聞いてるのよ:

int main(){ 
     printf("hello from main!); 
     char *buffer = "some data"; 

    if(pthread_creat(&mythreadpid, NULL, thread1, buffer){ 
     printf("ERROR!!"); 
    } 

    execv(...) //do execv here 

} 

void *thread1(void *buffer){ 
    printf("calling from my thread!"); 

//do something else 

} 

は、私はこれをテストしていると私は私のスレッドとしての経験奇妙な行動は、私はこれはそれ

の理由があるかどうかを知りたいので、完了しませんでした
+0

'execv'は、1つのスレッドだけでなく、プロセス全体を置き換えます。 – Barmar

+0

メインとメインから作成したスレッドを置き換えますか? – unconditionalcoder

+0

はい、現在のプロセスのすべてのメモリと状態は、環境とファイル記述子を除き、execによって上書きされます。 – Barmar

答えて

3

すべてのexec機能は、プロセス全体を実行中のプログラムに置き換えます。すべてのスレッドが破棄されます。

現在のプロセスに影響を与えずに別のプログラムを実行する場合は、最初にfork()を使用して新しいプロセスを作成し、子プロセスでexecv()を呼び出す必要があります。マルチスレッドプログラムでfork()を使用する際に注意すべき点については、Is it safe to fork from within a thread?を参照してください。

+0

環境だけでなく、開いているファイルディスクリプタもexecよりもさらに多く維持されています。現在の作業ディレクトリ。無視された信号と信号マスクの配置。 umask; ptrace状態... – caf

+0

@cafありがとう、私はいくつかの詳細が不足していたと感じていた。私はそれを削除しました。この質問にはそれほど重要ではないからです。 – Barmar

+0

@caf、別のコメントで、環境**が** exec **(2)の呼び出しで**指定されているので、それも置き換えられます。環境はプロセスの仮想空間に保存され、保存されているのはオープンディスクリプタのようなリソースだけで、プロセス仮想アドレス空間には格納されません。新しい環境を要求しない呼び出しは、新しい 'exec *(2)'呼び出しのパラメータとして受け取った環境だけを使用します。 * O_CLOEXECフラグがない*オープンディスクリプタのみが保持されます。それを持っているものは閉じられるでしょう。また、すべての 'mmap(2)'セグメントを失います。 –

関連する問題