发送信号

发送信号
  –使用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编程非常重要。
 
 
 
posted @ 2015-05-12 08:11  张仕传  阅读(651)  评论(0编辑  收藏  举报