2012-04-15 13 views
0

私は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; 

} 

答えて

1

wait()も(あなたのstraceがあなたを示しているものである)ECHILDに値-1errnoセットで、すぐに戻ります。子プロセスが存在しない場合に何をすることを期待していましたか?

+0

ありがとうございます。私は、 "待たれていない子供たち"がマンページで何を意味していたのかよく分かりませんでした。とにかく終了した子があるまで(例えば、別のスレッドが終了した子を開始するなど)、ブロックされることが予想されました。 –

+0

なぜ、タイマー信号がオフになるのを待つべきです。ハンドラを呼び出すと、子プロセスをfork()し、その子プロセスを待機します。 :) – Kaz

+0

信号を使用している場合、私はむしろSIGCHLDを待つべきです:) –

1

wait()コール文書化されたとおりに動作します。それがエラーをブロックしても意味がありませんので、したがって、それは、ブロックされません

ECHILD (for wait()) The calling process does not have any unwaited-for 
      children. 

    ECHILD (for waitpid() or waitid()) The process specified by pid (waitpid()) or 
      idtype and id (waitid()) does not exist or is not a child of the 
      calling process. (This can happen for one's own child if the action 
      for SIGCHLD is set to SIG_IGN. See also the Linux Notes section about 
      threads.) 

    EINTR WNOHANG was not set and an unblocked signal or a SIGCHLD was caught; 
      see signal(7). 

    EINVAL The options argument was invalid. 

:何に実行していることはERRORSセクションhereで説明したエラー状態です。待つために子プロセスが存在しない場合

関連する問題