1

forkした後、子プロセスでexeclを使いたいです。execl はスクリプトを実行しますが、これには約 120 秒かかります。異なる引数 (0、WNOHANG など) を使用して、waitpid、wait、および waitid のほとんどすべての組み合わせを試しましたが、すべての場合で戻り値が -1 になります。だから私はいつ使用する必要がある待機関数を知りたいですか? そのため、1 つの待機関数に集中して機能させることができます。

ログから観察したもう 1 つの興味深い点は、子プロセスで何もしていないときに、親スレッドが孤立していると表示されることです。私はそれがどのように可能かわかりませんか?親スレッドが孤立するのはどうしてですか?

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
    pid_t Checksum_pid = fork();

    if (Checksum_pid < 0)
        printf("Fork Failed\n");
    else if (Checksum_pid == 0)
    {
        execl("/bin/ls","ls",(char *)NULL) ;
        exit(EXIT_FAILURE);
    }
    else
    {
        int childStatus;
        pid_t returnValue = waitpid(Checksum_pid, &childStatus, 0);

        if (returnValue > 0)
        {
            if (WIFEXITED(childStatus))
                printf("Exit Code: %d\n", WEXITSTATUS(childStatus));

        }
        else if (returnValue == 0)
            printf("Child process still running\n");
        else
        {
            if (errno == ECHILD)
                printf(" Error ECHILD!!\n");
            else if (errno == EINTR)
                printf(" Error EINTR!!\n");
            else
                printf("Error EINVAL!!\n");
        }
    }

    return 0;
}
4

1 に答える 1

1

私がコメントしたように:あなたの最後elseはただあるべきです

 else perror("waitpid");

しかし、あなたは得てECHILDいます。なので、 waitpid(2)の man ページを読んでください:

   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.)

ところで、私はあなたのエラーを再現できません。ulimit -aon bashで指定された制限も確認してください。

失敗するexecl可能性があります (特に、代わりにスクリプトを実行する場合/bin/ls)。その後に呼び出しを追加しますperror

また、コンパイルしgcc -Wall -g て使用straceし、gdb

于 2014-04-08T10:32:14.753 に答える