1、函数实例。
下面这个示例首先使用 fork()创建了一个子进程,接着为了保证子进程不在父进程调用 kill()之前退出,在
子进程中使用 raise()函数向自身发送 SIGSTOP 信号,使子进程暂停。接下来再在父进程中调用 kill()向子
进程发送信号,在该示例中使用的是 SIGKILL,读者可以使用其他信号进行练习。
/* kill_raise.c */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int ret;
/* 创建一子进程 */
if ((pid = fork()) < 0)
{
printf("Fork error\n");
exit(1);
}
if (pid == 0)
{
/* 在子进程中使用 raise()函数发出 SIGSTOP 信号,使子进程暂停 */
printf("Child(pid : %d) is waiting for any signal\n", getpid());
raise(SIGSTOP);
exit(0);
}
else
{
/* 在父进程中收集子进程发出的信号,并调用 kill()函数进行相应的操作 */
if ((waitpid(pid, NULL, WNOHANG)) == 0)
{
if ((ret = kill(pid, SIGKILL)) == 0)
{
printf("Parent kill %d\n",pid);
}
}
waitpid(pid, NULL, 0);
exit(0);
}
}
该程序运行结果如下所示:
$ ./kill_raise
Child(pid : 4877) is waiting for any signal
Parent kill 4877
2、函数实例。
该实例实际上已完成了一个简单的 sleep()函数的功能,由于 SIGALARM 默认的系统动作为终止该进程,
因此程序在打印信息之前,就会被结束了。代码如下所示:
/* alarm_pause.c */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*调用 alarm 定时器函数*/
int ret = alarm(5);
pause();
printf("I have been waken up.\n",ret); /* 此语句不会被执行 */
}
$./alarm_pause
Alarm clock
3、使用实例。
第一个实例表明了如何使用 signal()函数捕捉相应信号,并做出给定的处理。这里,my_func 就是信号处理
的函数指针。读者还可以将其改为 SIG_IGN 或 SIG_DFL 查看运行结果。第二个实例是用 sigaction()函数
实现同样的功能。
以下是使用 signal()函数的示例:
/* signal.c */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
/*自定义信号处理函数*/
void my_func(int sign_no)
{
if (sign_no == SIGINT)
{
printf("I have get SIGINT\n");
}
else if (sign_no == SIGQUIT)
{
printf("I have get SIGQUIT\n");
}
}
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT...\n");
/* 发出相应的信号,并跳转到信号处理函数处 */
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
exit(0);
}
运行结果如下所示。
$ ./signal
Waiting for signal SIGINT or SIGQUIT...
I have get SIGINT (按 ctrl-c 组合键)
$ ./signal
Waiting for signal SIGINT or SIGQUIT...
I have get SIGQUIT (按 ctrl-\ 组合键)
以下是用 sigaction()函数实现同样的功能,下面只列出更新的 main()函数部分。
/* sigaction.c /
/ 前部分省略 */
int main()
{
struct sigaction action;
printf("Waiting for signal SIGINT or SIGQUIT...\n");
/* sigaction 结构初始化 */
action.sa_handler = my_func;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
/* 发出相应的信号,并跳转到信号处理函数处 */
sigaction(SIGINT, &action, 0);
sigaction(SIGQUIT, &action, 0);
pause();
exit(0);
}