发送信号
发送信号
–使用kill命令
•在命令行使用kill命令,向指定进程发送信号。
–使用kill函数
#include <signal.h>
#include <sys/types.h>
int kill(pid_t pid, int sig);
•参数pid指定一个要杀死的进程,而sig是要发送的信号。
kill函数例子
int main(int arg, char *args[]) { if (arg > 1) { int pid = atoi(args[1]); kill(pid, SIGKILL); } else { printf("pid = %u\n",getpid()); sleep(60); } return 0; }
发送信号
–使用raise函数
#include <signal.h>
int raise(int signo);
kill函数将信号发送给进程,raise函数允许进程向自身发送信号;
raise(signo)等价于kill(getpid(), signo)。
alarm函数设置了一个定时器,当定时器到了就发送SIGALRM信号。
#include <unistd.h>
nsigned int alarm(unsigned int seconds);
seconds是计时器时间到后时钟的秒数。
如果没有设置其他超时,函数返回0,否则返回值为前面安排超时中保留的秒数
一个进程只能设置一次超时
把seconds设置为0可以取消前面的超时设置。
alarm函数例子
void catch_Signal(int Sign) { switch(Sign) { case SIGALRM: printf("SIGALRM Signal\n"); } } int main(int arg, char *args[]) { signal(SIGALRM, catch_Signal); alarm(1); pause(); return 0; }
abort函数。
void abort(void);
该函数发送SIGABRT信号给调用进程,进程不应该忽略这个信号。
即使进程捕捉到SIGABRT这个信号,进程还是会异常退出。
让进程捕捉SIGABRT的意图是,在进程终止前由其执行所需的清理操作。
sleep函数。
nsigned int sleep(unsigned int seconds);
参数seconds指定了睡眠时间。
超过seconds指定时间,函数返回。
调用进程捕捉到一个信号并从信号处理程序返回。
作业控制信号。
–SIGCHLD-子进程已停止或终止;
–SIGCONT-如果进程已经停止,使其继续运行;
–SIGSTOP-停止信号,不能被捕捉或者忽略;
–SIGTTIN-后台进程组成员读控制终端;
–SIGTTOU-后台进程组成员写到控制终端。
除SIGCHLD以外,大多数程序并不处理这些信号。
Shell程序一般需要处理些信号。
信号用于大多数复杂的应用程序中。
理解信号处理对于Linux编程非常重要。