RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 793957
Accepted
Егор Филатов
Егор Филатов
Asked:2020-03-05 21:58:04 +0000 UTC2020-03-05 21:58:04 +0000 UTC 2020-03-05 21:58:04 +0000 UTC

接收信号。签名()。对信号的误解

  • 772

假设有一个程序,当接收到某个信号时,打印该信号的编号以及ID发送该信号的进程。在代码中,一切看起来像这样:

用作函数的信号处理程序的函数sigaction()

void fun(int sig, siginfo_t *make, void *arg){
    printf("Received signal: %d\n", sig);
    printf("From process %u\n", make->si_pid);
    printf("Done from function\n");
}

还有我自己main()

int main(void)
{
    struct sigaction test;
    memset(&test, 0, sizeof(test));
    printf("I am process %i\n", getpid());

    test.sa_sigaction = &fun;
    test.sa_flags = SA_SIGINFO;
    sigaction(SIGTERM, &test, NULL);

    sleep(100);
    printf("Done from main\n");

    return 0;
}

该程序将使用一个信号SIGTERM- 一个请求进程结束的信号。文末会写怎么看程序的输出,不过现在想问几个问题:

1)请告诉我,sigaction()是否为该函数创建了一个单独的进程/线程?我只是不太明白为什么,当我在 main() 中调用这个函数时,它只在收到信号时才执行,而不是在我调用它时立即执行。

2)我不太明白 flag 的含义SIGINFO,但是如果我不设置它,那么答案会有所不同。请解释它的用途(程序/用户)

3)为什么,当控制从一个函数返回到另一个sigaction()函数main()时,程序立即显示该短语Done from main,而不是100在调用函数后等待几秒钟过去sleep()。而如果为 单独创建线程sigaction(),那为什么sleep()接收到信号后会被忽略

程序输出:运行这个程序并记住函数输出到printf()终端的数字,然后打开另一个终端并在那里写入以下命令

kill -SIGTERM <pid>

,其中 pid 是您记住的数字。

ps linux下可以,windows下没试过

linux
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    KoVadim
    2020-03-05T22:41:05Z2020-03-05T22:41:05Z

    printf 不能在信号内部调用。信号处理程序中允许的函数列表。

    1)当前线程被挂起,信号处理程序正在其中运行。

    2) 当应用程序接收到信号时,可能并非所有关于该信号的信息都可用。而用户需要调用 sigwaitinfo(2) 和 sigtimedwait(2) 来获取。如果设置了 SIGINFO 标志,那么所有这些信息都将立即可用。由于您正在显示有关发送信号的进程的信息,因此最好设置此标志。

    3)因为接收到一个信号会中断一些函数(长函数)的执行。睡眠包含在其中。法力上写得很清楚。

    sleep() 导致调用线程休眠,直到经过以秒为单位指定的实时秒数,或者直到没有被忽略的信号到达。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5