私はLinux上で比較的単純なpthreadプログラムを持っています。この目的のために、私は最後に投稿した小片にそれを取り除いた。wait()がブロックされず、Linuxおよびpthreads
wait(2)のすべてのmanページでは、WNOHANGが使用されていない限りwait()はブロックされません(wait()も指定できません)。トラス出力を見ると、それはちょうどノンストップの繰り返しです:wait4(2)のmanページを見て、再び
5460 wait4(-1, 0x7f8ee479fea8, 0, NULL) = -1 ECHILD (No child processes)
、それはリターン結果がのwaitpid()と同じである、とのwaitpidがすべきことを言いますそこWNOHANGであり、トラスはコールオプションは参考0
された状態で行われたことを示しているブロックしない限り、これは:
- 2.6.32-300.3.1.el6uek.x86_64
- のglibc -2.12-1.47.el6_2.9.x86_64
- のgcc-4.4.6-3.el6.x86_64
- してコンパイル:gccの-pthread -lpthread -o PTW -Wall ptw.c
-
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
static pthread_mutex_t _lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t _sem = PTHREAD_COND_INITIALIZER;
static void* waiter(void*);
int main(int argc, char ** argv) {
pthread_t thr;
if (pthread_create(&thr, 0, waiter, 0)) {
perror("pthread_create");
return 1;
}
pthread_mutex_lock(&_lock);
pthread_cond_wait(&_sem, &_lock);
return 0;
}
void* waiter(void* arg) {
while (1) {
int status;
int p = wait(&status);
if (p<0) {
perror("wait");
// fprintf(stderr, "wait returned without exited child\n");
}
}
return 0;
}
ありがとうございます。私は、 "待たれていない子供たち"がマンページで何を意味していたのかよく分かりませんでした。とにかく終了した子があるまで(例えば、別のスレッドが終了した子を開始するなど)、ブロックされることが予想されました。 –
なぜ、タイマー信号がオフになるのを待つべきです。ハンドラを呼び出すと、子プロセスをfork()し、その子プロセスを待機します。 :) – Kaz
信号を使用している場合、私はむしろSIGCHLDを待つべきです:) –