kill
//fork可以返回两个值
//父进程中,fork返回子进程的ID,子进程中返回0
//pid:可能选择有以下四种
//功能:杀死进程
//参数:进程号,kill -l
// 1. pid大于零时,pid是信号欲送往的进程的标识。
// 2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
// 3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
// 4. pid小于-1时,信号将送往以-pid为组标识的进程。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();
if(pid == -1)
{
perror("fork");
return 0;
}
else if(pid == 0)
{
while(1)
{
printf("子进程等待KILL信号\n");
sleep(1);
}
}
else if(pid > 0)
{
int i = 0;
for(i = 0; i < 2; i++)
{
printf("父进程执行中\n");
sleep(1);
}
kill(pid, SIGKILL);
}
return 0;
}
执行结果:
alarm
//alarm所在进程时自杀
//如果没有设置过定时器,或定时器超时,返回0,否则返回剩余时间,并重新定时
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char *argv[])
{
int second = 0;
second = alarm(5);
printf("second = %d\n", second);
sleep(2);
second = alarm(5);
printf("second = %d\n", second);
while(1)
{
printf("等待alarm定时结束\n");
sleep(1);
}
return 0;
}
执行结果:
abort
//abort
//功能:发送SIGABRT信号,终止所在进程
//参数:无
//信号不会被阻塞
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char *argv[])
{
printf("等待abort\n");
sleep(2);
abort();
printf("abort error\n");
return 0;
}
执行结果:
raise
//raise
//功能:杀死所在进程
//参数:kill -l
//返回值:成功0,失败-1
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char *argv[])
{
printf("等待raise\n");
sleep(2);
raise(SIGALRM);
printf("raise error\n");
return 0;
}
执行结果:
pause
//pause
//功能:挂起进程直至捕捉到信号
//返回值,捕捉到信号返回-1
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char *argv[])
{
printf("before pause\n");
pause();
printf("pause error\n");
return 0;
}
执行结果:
signal
//回调函数void signal_handler(int)
//当收到信号执行回调函数signal_handler
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
//signal
void signal_handler(int signo)
{
if(signo == SIGINT)
printf("receive SIGINT\n");
else if(signo == SIGQUIT)
printf("receive SIGQUIT");
}
int main(int argc, char *argv[])
{
printf("wait for SIGINT OR SIGQUOT\n");
signal(SIGINT, signal_handler);
signal(SIGQUIT, signal_handler);
pause();
pause();
return 0;
}
执行结果:
signal返回值
//signal函数返回值
//当收到的信号事第一次注册返回NULL,否则返回上一次注册函数的地址
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
typedef void(*sighandler_t)(int);
void fun1(int signo)
{
}
void fun2(int signo)
{
}
int main(int argc, char *argv[])
{
sighandler_t pre = NULL;
pre = signal(SIGINT, fun1);
if(pre == NULL)
{
printf("fun addr is null\n");
}
pre = signal(SIGINT, fun1);
if(pre == fun1)
{
printf("fun addr is fun1\n");
}
pre = signal(SIGQUIT, fun2);
if(pre == NULL)
{
printf("fun addr is null\n");
}
raise(SIGINT);
raise(SIGINT);
raise(SIGQUIT);
return 0;
}
执行结果: