Linux信号举例:掌握常用信号及其应用! (linux信号举例)


Linux信号举例:掌握常用信号及其应用!

作为一个长期存在于计算机操作系统中的重要组成部分,信号是指软件中某个特定事件的通知,可以被发送给进程或者线程,并由其作出相应的处理。在现代操作系统中,信号的应用十分广泛,Linux系统也不例外。下面将重点介绍Linux信号的功能、种类及其应用举例。

一、Linux信号的功能

Linux信号是操作系统在进程间通信时借助的一种轻量级的通信机制。通过传递信号,可以实现多个进程之间的互动和信息交流。而Linux系统的信号机制可以在操作系统中采用异步方式进行处理,保证进程间的调度。

常见的Linux信号有30左右,其中重要的信号比较多。在信号机制中,进程可以发送信号,也可以接收信号。

二、Linux信号的种类

1.SIGHUP信号

SIGHUP信号是表示工作控制终端丢失的信号,一般会在缩写为HUP的情况下出现。

2.SIGINT信号

SIGINT信号是因为当程序由于从终端接收CTRL+C信号而终止时,这种情况下出现的信号,缩写为INT。

3.SIGQUIT信号

SIGQUIT表示退出程序的信号,一般是在CTRL+\情况下发生。

4.SIGKILL信号

SIGKILL表示强制终止进程的信号,不会忽略进程的处理函数,也称为kill命令的强制类型。

5.SIGABRT信号

SIGABRT是由标准C库的abort()函数发送的终止线程或进程错误信号,缩写为ABRT。

6.SIGALRM信号

SIGALRM是由定时器到达时间而被发送的信号,缩写为ALRM。

7.SIGCONT信号

SIGCONT是被暂停的进程恢复执行的信号,缩写为CONT。

8.SIGCHLD信号

SIGCHLD是由父进程等待子进程或子进程终止而被发送的信号,缩写为CHLD。

9.SIGSTOP信号

SIGSTOP表示暂停进程的信号,该进程可以被继续执行,但是不能修改或比较其状态,缩写为STOP。

10.SIGUSR1和SIGUSR2信号

SIGUSR1和SIGUSR2是由用户定义的信号,用作进程间通信的其它形式,缩写为USR1和USR2。

三、Linux信号的应用举例

1.kill命令

我们可以使用kill命令发送信号来终止进程。在Linux系统中,可以使用两种方式发送信号,其中之一种方式是通过进程ID(PID),第二种方式是通过名称。如下:

杀死格式为PID的进程:

kill -信号值 进程PID

例如,杀死进程ID为5555的进程,使用如下命令:

kill -SIGTERM 5555

杀死所有同名进程:

kill -signal (进程名称)

例如,杀死所有名为“nginx”的进程,使用如下命令:

killall -SIGKILL nginx

2.fork函数

Linux系统中,fork()函数可以创建新的进程,并在该子进程的进程空间中对其运行进程状态的保存。代码如下:

pid_t pid = fork ();

if (pid > 0) {

/* Parent process, child id is pid */

} else if (pid == 0) {

/* Child process, do something */

} else {

/* Error, fled to create child process */

}

这里的fork函数创建一个新的进程,并返回一个pid值。如果返回值大于0,则表示此为父进程,并提供子进程的pid。如果返回值为0,则表示当前进程为子进程。如果fork函数失败,则返回值为-1,此时应处理错误。

3.wtpid函数

可以等待指定PID的子进程终止,并获取子进程的状态码,其中WIFEXITED和WEXITSTATUS函数是最常用的两个函数。代码如下:

pid_t pid, childpid;

int status;

while (1) {

/* Wting for child processes to complete */

childpid = wtpid (pid, &status, WUNTRACED | WCONTINUED);

if (childpid == -1) {

break;

}

if (WIFEXITED (status)) {

printf (“Process %u exited with status %d\n”,

(unsigned int) childpid, WEXITSTATUS (status));

} else if (WIFSIGNALED (status)) {

printf (“Process %d was interrupted with signal %d\n”,

childpid, WTERMSIG (status));

} else if (WIFSTOPPED (status)) {

printf (“Process %d was stopped with signal %d\n”,

childpid, WSTOPSIG (status));

} else if (WIFCONTINUED (status)) {

printf (“Process %d was resumed\n”, childpid);

}

}

这里的wtpid函数等待指定PID的子进程终止,并通过status参数获取子进程终止状态,而WIFEXITED和WEXITSTATUS函数则用来获取进程的终止状态。

4.signal函数

signal函数用来设置指定信号处理函数,如下:

void (*signal (int signo, void (*func)(int)))(int);

其中,参数signo表示要设置的信号值;参数func表示要处理的函数。例如:

void handle_signal (int signo) {

if (signo == SIGHUP) {

printf (“Hangup received…\n”);

}

}

signal (SIGHUP, handle_signal);

这里的信号值是SIGHUP,而函数的名称是handle_signal。在函数处理过程中,当信号值等于SIGHUP时,将打印消息。

正如我们所见,Linux信号在系统操作和进程通信中发挥着非常重要的作用。工具和技术可以独立处理信号,但是了解和掌握不同类型的Linux信号,并在实践中正确地应用它们可以在系统调试和开发等方面更加轻松高效,提高了工作效率。

相关问题拓展阅读:

  • 关于linux下的信号的问题

关于linux下的信号的问题

每个进程都有一个阻塞位图和一个信号位图,当检查信号时,会把阻塞位图取反与上信号位图。系统发晌咐闭送信号时只改变信号位图,设置信号阻塞状态只改变阻塞位图,他们其实没得好大关系,只宴裂是在信号检查时,一旦该信号被阻塞,这个信号就相简并当于不存在,不执行任何操作。

信号判搜是否阻塞,只是信号mask的状态,决定对将来收到信号的处理方式。

无论你是否给他信号,这个状态都已经设定。

这个代码先block SIGINT, 然掘毁历后sleep 10秒等待信号. 10秒后,检查10秒内余哗是否输入了SIGINT信号.(如果输入了,会被block, handler不会被调用, sleep会被中断.). 不管如何,随后立即解除对SIGINT的block. 最后,进入死循环,这时如果ctrl+C, 会发现 handler能被调用.

看不懂。。。。。。。。。顶。。

linux信号举例的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux信号举例,Linux信号举例:掌握常用信号及其应用!,关于linux下的信号的问题的信息别忘了在本站进行查找喔。