首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是由子继承的setitimer()调用。

是由子继承的setitimer()调用。
EN

Stack Overflow用户
提问于 2019-04-18 12:50:15
回答 1查看 224关注 0票数 1

我在写一个分叉代码(号码是3,5,.不定数)。我希望我的程序在指定的时间后结束(父母首先杀死它的孩子,然后可能通过调用_exit,这也是安全的)。我的意思是,在信号处理程序中,我通过杀害()杀死整个孩子,然后为所有这些都调用waitpid(),因为这两个函数都是异步信号安全函数。要做到这一点,我在分叉之前使用setitimer(ITIMER_REAL, &timer, NULL

那么它是分叉的孩子继承的吗?

如果它不是继承的,你能显示一个来源吗?

如果它是继承的,那么所有的孩子都会在时间被占用之后结束吗?另外,实际上我不想要这个案子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-18 13:07:25

不是遗传的。

POSIX叉子规范显式地提到定时器不是继承的,XSI (timer_create/timer_settime)计时器是重置的:

  • 在子进程中,应重置XSI间隔定时器。选择端
  • 父进程创建的每个进程定时器不应由子进程继承。

一个测试程序,如:

代码语言:javascript
复制
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>

void h(int Sig)
{
    char pid[20];
    sprintf(pid,"%d\n",(int)getpid());
    (void)write(1,pid,strlen(pid));
}
int main()
{
    if(0>sigaction(SIGALRM,&(struct sigaction){.sa_handler=h},0)) return perror("sigaction"),1;
    if(0>setitimer(ITIMER_REAL, &(struct itimerval){.it_value.tv_sec=1},0)) return perror("setitimer"),1;
    pid_t ch; if(0>(ch=fork())) return perror("fork"),1;
    pause();
    if(ch){
        sleep(1);
        kill(ch,SIGTERM);
    }
    _exit(0);
}

显示处理程序仅在父处理程序中运行-它只打印一个pid。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55746442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档