我想制作一个分叉 6次的程序:分叉的第一个孩子将分叉另外的 5个孩子(孙子),并且将它们设置为无休止的循环,此外,我想在第一个孩子进行分叉的同时将倒计时设置为5秒。倒计时结束后,我会向第一个孩子发送信号,以终止5个孙子并打印多少用户时间和系统时间(第一个孩子用了)。
我想做这样的事情:
倒数结束后我要发送给第一个孩子的信号是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 在内核上执行任务时花费的时间 代表调用过程。