【问题标题】:C- what exactly is SIGUSR1 syntacticallyC- SIGUSR1 在语法上到底是什么
【发布时间】:2016-04-16 05:32:04
【问题描述】:

当我在 kill() 或 signal() 函数中使用 SIGUSR1 时,它在做什么?是宏吗?我读到它是用户定义的,但它在哪里定义?我可以制作一个 SIGUSR10(或以编程方式制作一个不同信号类型的“数组”)吗?

【问题讨论】:

  • 它可能在<signal.h> 或其中包含的文件中定义。你不能随身携带自己的。
  • SIGUSR1 是“用户定义的”,因为实现从不生成 SIGUSR1 本身(而诸如 SIGHUPSIGINTSIGQUITSIGPIPESIGTERM 之类的信号是有时由系统生成)。

标签: c signals kill


【解决方案1】:

用户定义的信号是指这些信号没有明确的含义,不像SIGSEGVSIGCONTSIGSTOP等,内核永远不会向进程发送SIGUSR1或SIGUSR2,所以可以设置信号的含义由您根据您的应用程序的需要。所有这些大写的SIG 常量实际上都是宏,它们将扩展为一个整数,表示特定实现中的信号编号。尽管用户定义的信号不一定需要定义,但信号编号在特定实现中已经固定,并且可以安全地重新使用它们,因为它们不会由除用户之外的任何人发送.

传统上,有两个用户定义的信号:SIGUSR1SIGUSR2。但是,最近的实现有一些称为“POSIX 实时信号”的东西,它提供了更多用户定义的信号。

【讨论】:

    【解决方案2】:

    SIGUSR,顾名思义,是一个保留给用户(开发者)使用的信号,没有任何“特殊”的预定义含义。您不能制作 10 个,在大多数 POSIX 系统上只有两个 - SIGUSR1 和 SIGUSR2。

    符号本身可能是也可能不是宏扩展,但最终会成为与 int 兼容的数值赋值。

    要以有意义的方式使用它,您需要编写一个信号处理程序。有关如何执行此操作的详细信息,请参见 signal() 手册页。

    【讨论】:

    • 实际上,POSIX defines: 头文件应定义以下宏,用于引用系统中出现的信号。此处定义的信号以字母SIG 开头,后跟一个大写字母。宏应扩展为具有int 类型和不同值的正整数常量表达式。因此信号名称应为宏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2017-07-04
    • 1970-01-01
    • 2012-05-27
    • 2014-05-06
    相关资源
    最近更新 更多