wait()不等每个孩子

时间:2015-10-13 16:45:06

标签: c parent-child wait exit-code waitpid

我有一个创建'n'子进程的循环。进程进入一个单独的程序并休眠'x'秒然后返回退出状态'x'。问题是当我试图等待每个单独的过程时。似乎我的wait()调用等待最后一个进程,然后程序退出。我希望它可以让孩子退出,我可以打印他们的信息,然后等待下一个孩子退出并打印他们的信息......等等。

代码:

IF OBJECT_ID('tempdb..#dump') IS NOT NULL
    DROP TABLE #dump

CREATE TABLE #dump (Value MONEY)
CREATE INDEX [IXDUMP] ON #dump(Value)

DECLARE @i INT, @val MONEY
SET @i=1

WHILE @i <= 100000 /* SET THIS TO DESIRED COUNT */
BEGIN
    SELECT @val=CONVERT(MONEY,RAND()*15000)

    IF NOT EXISTS (SELECT 1 FROM #dump WHERE Value=@val)
    BEGIN
        INSERT INTO #dump(Value) 
        SELECT @val

        SET @i=@i+1
    END
    ELSE
    BEGIN
        PRINT '*'
        /* DO NOTHING, GO AGAIN, WITH SAME @i VALUE */
    END
END

/* DUPE VALUE CHECK */
SELECT Value
FROM #dump
GROUP BY Value
HAVING COUNT(2)>1

/* COUNT CHECK */
SELECT COUNT(2)
FROM #dump

输出:

int main()
{
      char input[12];
      int n, i, ch;
      pid_t pid;
      int status={0};

      printf("Enter an integer: ");
      fgets(input, 12, stdin);
      if (input[10] == '\n' && input[11] == '\0') { while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); }
      rmnewline(input);

      n = atoi(input);

      for(i=0; i<=n-1; i++)
      {
      pid = fork();
      if(pid == 0)
        execl("/home/andrew/USP_ASG2/sleep", "sleep", NULL);
      }

      for(i=0; i<=n-1; i++)
      {
        wait(&status);
        if(WIFEXITED(status))
        {
          int exitstat = WEXITSTATUS(status);
          printf("Child %d is dead with exit status %d\n", pid, exitstat);
        }
      }
}

1 个答案:

答案 0 :(得分:2)

您忘记捕获wait()的返回值,因此pid仍然包含您分叉的最后一个进程的pid。

这样做:

pid = wait(&status);

你会得到预期的输出。