按终止顺序打印?

Mos*_*she 8 c fork process waitpid

我有一个程序生成一个随机数n,然后循环n次.

在每次迭代中,它随机化值的值sleeptime,并调用fork.子进程休眠sleeptime几秒钟,然后使用索引变量的值退出.

然后父进程再次循环,等待每个进程终止.当每个进程终止时,我正在尝试注销进程的pid和childid,但这就是我遇到麻烦的地方.pids按顺序打印,childid保持为0.

我究竟做错了什么?

int main(int argc, char* argv[])
{

    //  Wire up the timer
    long time = elapsedTime(0);

    /*  Generate a random number between MINFORKS and MAXFORKS
     */
    unsigned int seed = generateSeed(0);
    int n = rand_r(&seed) % MAXFORKS + MINFORKS-1;

    /*  Log next step
     */
    time = elapsedTime(1);
    printf("%li: Number of forks = %i\n", time, n);

    /*  Hang on to the PIDs so we can wait for them after forking
     */
    pid_t *PIDs = (pid_t *)(malloc(sizeof(*PIDs)*n));


    /*  Fork n times
     */
    for (int i = 0; i < n ; i++)
    {
        /*  Call fork() and retain the returned identifier
         */
        pid_t processIdentifier = fork();

        /* Randomize the child sleep time
         */
        seed = generateSeed(0);
        int sleeptime = rand_r(&seed)  % MAXPAUSE + MINPAUSE;

        /*  Check for errors
         */
        if (processIdentifier == -1) {
            printf("Error: %i", errno);
        }


        if (!processIdentifier)
        {
            /*  We're in the child process,
             *  sleep and then exit with
             *  i as the error code.
             */

            usleep(sleeptime);
            _exit(i);
        }
        else
        {
            /*  We're in the parent:
             *  Store the PID and
             *  print out the results.
             */

            PIDs[i] = processIdentifier;

            time = elapsedTime(1);
            printf("%li: Child %i, pid = %i, forked, waits %i usec\n", time,  i, processIdentifier, sleeptime);

        }
    }

    /* Log next step
     */
    time = elapsedTime(1);
    printf("%li: Finished forking, going to wait.\n", time);

    /*
     *  Loop through the processes and wait for them
     *  to terminate. Then print the childid, and the
     *  the pid.
     */

    for (int i = 0; i < n; i++)
    {

        /*  Get the PID we want to track
         */
        pid_t pid = PIDs[i];

        /*  Wait for the child process
         *  and grab it's status info
         */
        int status = NULL;


        waitpid(pid, &status, 0);

        int childid = -1;
        if(WIFEXITED(status))
        {
            childid = WTERMSIG(status);
        }

        /*  Log the results
         */
        time = elapsedTime(1);
        printf("%li: Child %i, pid = %i, terminated\n", time, childid, pid);
    }

    /*  All done!
     */
    time = elapsedTime(1);
    printf("All done. It only took %li milliseconds!", time);   
}
Run Code Online (Sandbox Code Playgroud)

免责声明,这是家庭作业(链接在这里,可能随时消失),但我已经完成了几乎所有的工作.我只是很难理解它的这一方面.

jxh*_*jxh 4

您的代码正在按照您在连续waitpid()调用中提供的顺序等待 pid。如果您-1作为第一个参数传入waitpid()(或者如果您只是调用wait()),您将获得内核通知您的第一个子项,而不是您特别要求通知的子项。检查返回值以查看它是哪个子项(或者是否发生错误)。

停留childid0因为您正在WTERMSIG从等待状态中提取,而不是WEXITSTATUS