0
void *stack;
stack = malloc(STACK_SIZE);
if (-1 == clone(child_thread, stack + STACK_SIZE, 0, NULL)) {                                                                                                                                                                           
    perror("clone failed:");
}   
while(waitid(P_ALL, 0, NULL, WEXITED) != 0){ 
    perror("waitid failed:");
    sleep(1);
}   

マニュアルには次のように書かれています。

子がすでに状態を変更している場合、これらの呼び出しはすぐに戻ります。それ以外の場合は、いずれかの子が状態を変更するまでブロックします

しかし実際にはすぐに戻ります:

waitid failed:: No child processes
waitid failed:: No child processes
...

何かアドバイス?

4

2 に答える 2

1

PID オプションを使用しています。manページをさらに見てください:

次の Linux 固有のオプションは、clone(2) を使用して作成された子で使用するためのものです。それらは waitid() では使用できません:

   __WCLONE
          Wait  for "clone" children only.  If omitted then wait for "non-
          clone" children only.  (A "clone" child is one which delivers no
          signal, or a signal other than SIGCHLD to its parent upon termi-
          nation.)  This option is ignored if __WALL is also specified.

   __WALL (Since Linux 2.4) Wait for  all  children,  regardless  of  type
          ("clone" or "non-clone").

   __WNOTHREAD
          (Since  Linux  2.4) Do not wait for children of other threads in
          the same thread group. This was the default before Linux 2.4.
于 2012-12-13T05:35:57.143 に答える
1

あなたがここでやろうとしていることの詳細はわかりませんが、次の方法で waitid を使用すると役立つ場合があります。

#include <sys/types.h>
#include <sys/wait.h>

...

siginfo_t signalInfo;
waitid(P_ALL, 0, &signalInfo, WEXITED | WSTOPPED | WNOWAIT | WNOHANG);

次に、signalInfo で次のことを確認して、子が終了するたびに何が起こったかを確認します。

signalInfo.si_signo : For Signal Number
signalInfo.si_code : Usually SIGCHLD
signalInfo.si_errno) : Any error code set
signalInfo.si_status : For exit code of the child code

注: WNOWAIT を使用すると、OS は、子プロセスが強制終了された後でもリソースの使用を保持します。このオプションを使用してもしなくてもかまいません。その場合は、WNOWAIT オプションを指定せずに、子に対して明示的に waitid を再度呼び出す必要があります。

参照: これに関する詳細は、waitid のマニュアル ページを参照してください。

于 2013-03-06T16:52:21.103 に答える