有没有办法在linux中创建自定义信号。就像让我们说“回声疯狂”在文件中执行一样?无论何时执行该信号,我都会使用该信号停止该过程...... 另外,我也希望使用带有新信号的perl Enbugger。有没有办法做到这一点? 我是从http://metacpan.org/pod/Enbugger
找到的 use Enbugger::OnError qw( USR1 USR2 INT HUP );
USR1和USR2是用户定义的信号。
答案 0 :(得分:7)
Perl中的信号处理涉及操作系统的信号功能,通常具有预定义和固定的信号集。但是许多系统确实分配了没有任何特定目的的“额外”信号,这些信号可以由用户进程使用。例如,我的Red Hat系统提供以下信号:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
您可以看到信号34到64都以SIGRTMIN
和SIGRTMAX
表示。这些是用户可以征服的信号,而不用担心干扰系统通常想要做的任何事情。在Perl中,您可以使用NUM35
等助记符为这些信号处理程序分配信号处理程序,并使用助记符(kill 'NUM37', $pid
)或仅使用信号编号(kill 37, $pid
)发送信号。
答案 1 :(得分:0)
信号就像一个中断,当它由用户级别生成时,会调用OS的内核并相应地执行操作。 要创建信号,我在这里向您展示一个示例
#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
void sig_handler1(int num)
{
printf("You are here becoz of signal:%d\n",num);
signal(SIGQUIT,SIG_DFL);
}
void sig_handler(int num)
{
printf("\nHi! You are here becz of signal:%d\n",num);
}
int main()
{
signal(SIGINT,sig_handler1);
signal(SIGQUIT,sig_handler);
while(1)
{
printf("Hello\n");
sleep(2);
}
}
运行此代码后如果按Ctrl + C,则会显示一条消息 - “你在这里becoz of signal:2”而不是退出进程,因为我们根据我们的操作更改了信号。因为,Ctrl + C是一个可屏蔽的信号。
要了解更多关于信号和信号类型的信息,请点击链接: