如何触发SIGUSR1和SIGUSR2?

hau*_*d85 51 c signals

我已经熟悉了C中的信号.我无法弄清楚是什么类型的信号SIGUSR1,SIGUSR2我怎么能触发它们.有人可以向我解释一下吗?

Oli*_*rth 72

它们是用户定义的信号,因此不会被任何特定操作触发.您可以通过编程方式显式发送它们:

#include <signal.h>

kill(pid, SIGUSR1);
Run Code Online (Sandbox Code Playgroud)

其中pid是接收进程的进程ID.在接收端,您可以为它们注册信号处理程序:

#include <signal.h>

void my_handler(int signum)
{
    if (signum == SIGUSR1)
    {
        printf("Received SIGUSR1!\n");
    }
}

signal(SIGUSR1, my_handler);
Run Code Online (Sandbox Code Playgroud)

  • @haunted:它们专为简单的进程间通信(IPC)而设计.因此,子进程可以将其发送给其父进程,以指示它已完成某项任务.显然,IPC存在更复杂的技术(例如管道,插座,信号量等). (8认同)
  • @ haunted85:一个具体的例子是mongodb在接收SIGUSR1时旋转它的日志文件: - 参见http://docs.mongodb.org/manual/tutorial/rotate-log-files/ (3认同)
  • @ haunted85这是一个将SIGUSR1用于AIO的示例:http://linux.die.net/man/7/aio (2认同)

cni*_*tar 6

它们是应用程序开发者使用的信号.内核不应该将这些发送到进程.您可以使用kill(2)或使用该实用程序发送它们kill(1).

如果您打算使用信号进行同步,您可能需要检查实时信号(其中有更多信号,它们排队,保证其交货顺序等).


Евг*_*кий 5

1号航站楼

dd if=/dev/sda of=debian.img
Run Code Online (Sandbox Code Playgroud)

2号航站楼

killall -SIGUSR1 dd
Run Code Online (Sandbox Code Playgroud)

回到第一航站楼

34292201+0 records in
34292200+0 records out
17557606400 bytes (18 GB) copied, 1034.7 s, 17.0 MB/s
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于rsync btw:`rsync错误:在main.c(1434)[sender = 3.1.1]处收到SIGUSR1(代码19)` (2认同)