信号是在软件层次上对中断机制的一种模拟。信号是进程间通信机制中唯一的异步通信机制。
信号发送——kill()和raise()
kill()
不仅可以终止进程(发送SIGTERM信号),也可以向进程发送其他信号
kill()
头文件:
#include <signal.h>
#include <sys/types.h>
函数原型:int kill(pid_t pis,int sig);
pid:
正数:发送信号给进程号为pid的进程
0:信号被发送到和当前进程同一进程组的进程
-1:信号发给所有的进程表中的进程(除了进程号最大的进程外)
<-1:信号发送给进程组号为-pid的每个进程
sig:信号类型
成功:0
失败:-1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
int main(int argc, char *argv[])
{
int n = 10;
while(n--)
{
if(n == 5)
{
kill(getpid(), 9); //?
}
sleep(1);
}
return 0;
}
raise()
只允许进程向自身发送信号
raise()
头文件:
#include <signal.h>
#include <sys/types.h>
函数原型:int raise(int sig);
sig:信号类型
成功:0
出错:-1
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
int main(int argc, char *argv[])
{
int n = 10;
while(n--)
{
if(n == 5)
{
raise(9);
}
sleep(1);
}
return 0;
}
示例:首先使用fork()创建了一个子进程,在子进程中使用raise()函数向自身发送SIGSTOP信号,使子进程暂停;接下来再在父进程中调用kill()向子进程发送信号,在该示例中使用的是SIGKILL。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
int main()
{
pid_t pid=fork(); //创建子进程
if(pid<0)
{
perror("fail to fork");
exit(-1);
}
else if(pid==0) //子进程
{
printf("child(pid:%d) is waiting for any signal\n",getpid());
raise(SIGSTOP); //子进程暂停
exit(0);
}
else //父进程
{
if((waitpid(pid,NULL,WNOHANG))==0) //收集子进程状态
{
kill(pid,SIGKILL); //调用kill()发送
printf("parent kill child process %d\n",pid);
}
waitpid(pid,NULL,0);
exit(0);
}
}