我的wait(),fork()和times()系统调用在做什么?

时间:2018-11-05 23:14:26

标签: c kernel fork system-calls

我想制作一个分叉 6次的程序:分叉的第一个孩子将分叉另外的 5个孩子(孙子),并且将它们设置为无休止的循环,此外,我想在第一个孩子进行分叉的同时将倒计时设置为5秒。倒计时结束后,我会向第一个孩子发送信号,以终止5个孙子并打印多少用户时间和系统时间(第一个孩子用了)。
我想做这样的事情: enter image description here

倒数结束后我要发送给第一个孩子的信号是SIGUSR1,它收到该信号后,会通过times()系统调用打印出用户时间和系统时间,然后使用killpg(getpgrp)终止整个进程组(),SIGTERM);

这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/signal.h>
#include <sys/times.h>

void print_time(int signum){
    struct tms t;
    perror("about to print time");
    if ((times(&t)) == -1)
    {
        perror("error times");
        exit(1);
    }

    else
    {
    printf("usertime: %f , systemtime:%f, usertime+systemtime: %f \n",  (double)t.tms_utime, (double)t.tms_stime, (double)t.tms_stime + (double)t.tms_utime);
    killpg(getpgrp(), SIGTERM); //finish the program by killing the whole group id
    }
}


int main()
{

    pid_t ppid = fork();
    if (ppid == 0)
    { //first child
        size_t count = 5;
        for (size_t i = 0; i < count; i++)  //fork 5 children(or 5 grandchildren) from  the first child and set them in an endless loop
        {

            pid_t pid = fork();
            if (pid == 0)
            {

                while (1)
                {
                }
            }

            else if (pid < 0)
            {
                perror("error forking from child ");
            }
        }
        if (signal(SIGUSR1, print_time) == SIG_ERR)   //set signal to the first child  so it print the time gathered by wait()
        {
            perror("cannot create signal");
            exit(1);
        }
        wait(NULL); //wait for the 5 children and gather time
    }

    else if (ppid > 0)
    { //parent
        if (signal(SIGUSR1, SIG_IGN) == SIG_ERR)   //ignore signal so it doesnt affect the parent
        {
            perror("cannot create signal parent");
            exit(1);
        }
        sleep(5);
        perror("going good");
        kill(ppid, SIGUSR1); //send signal to the process group but the parent and grandchildren doesnt get affected  

    }
    else
    {
        perror("error");
        exit(1);
    }

    return 0;
}

但是我只得到以下输出:

pc@pc-host:~/Git/so/p1$ about to print time: Success
usertime: 0.000000 , systemtime:0.000000, usertime+systemtime: 0.000000

为什么全为零? 根据此手册页http://man7.org/linux/man-pages/man2/times.2.html

  

tms_utime字段包含执行指令花费的CPU时间          调用过程的位置。 tms_stime字段包含CPU          在内核上执行任务时花费的时间          代表调用过程。

0 个答案:

没有答案