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信号,并在实践中正确地应用它们可以在系统调试和开发等方面更加轻松高效,提高了工作效率。