自己寫了一些代碼,看看到底內(nèi)部如何處理的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/stat.h>
#include <stdarg.h>
pid_t pid;
void mydebug(char *fmt, ...){
va_list argptr;
FILE *pFile;
if( ( pFile = fopen( "./mylog", "a+" ) ) == NULL )
return;
va_start( argptr, fmt );
vfprintf( pFile, fmt, argptr );
va_end( argptr );
fclose( pFile );
}
void sigTermHandler()
{
kill(pid,SIGTERM);
}
int main(){
int i=0;
signal(SIGTERM,(void (*)( ))sigTermHandler);
mydebug("創(chuàng)建進(jìn)程\n");
if((pid=fork())<0){
mydebug("fork失敗\n");
return -1;
}
if(pid==0){
if(execl("./sig2",(char *) 0) < 0){
mydebug("execl失敗\n");
exit(1);
}
}
mydebug("等待100秒\n");
sleep(10);
while(1){
kill(pid,SIGUSR1);
mydebug("已發(fā)送了USR1信號(hào) %d\n",i++);
sleep(5);
}
return 1;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/stat.h>
#include <stdarg.h>
void mydebug(char *fmt, ...){
va_list argptr;
FILE *pFile;
if( ( pFile = fopen( "./mylog", "a+" ) ) == NULL )
return;
va_start( argptr, fmt );
vfprintf( pFile, fmt, argptr );
va_end( argptr );
fclose( pFile );
}
void sigUsr1Handler()
{
signal(SIGUSR1,SIG_IGN);
mydebug("進(jìn)入了信號(hào)處理函數(shù)\n");
signal(SIGUSR1,(void (*)( ))sigUsr1Handler);
}
void sigTermHandler()
{
mydebug("接受到SIGTERM信號(hào),退出\n");
exit(0);
}
int main(){
int i=0;
signal(SIGUSR1,(void (*)( ))sigUsr1Handler);
signal(SIGTERM,(void (*)( ))sigTermHandler);
mydebug("進(jìn)入循環(huán)\n");
while(1){
sleep(10);
mydebug("i=%d\n",i++);
}
mydebug("退出程序\n");
return 0;
}
cc sig1.c -o sig1
cc sig2.c -o sig2
(使用-o sig1.o沒(méi)有編譯出應(yīng)用程序,也沒(méi)有提示錯(cuò)誤)
sig1&
tail -f mylog
創(chuàng)建進(jìn)程
等待100秒
進(jìn)入循環(huán)
已發(fā)送了USR1信號(hào) 0
進(jìn)入了信號(hào)處理函數(shù)
i=0
已發(fā)送了USR1信號(hào) 1
進(jìn)入了信號(hào)處理函數(shù)
i=1
已發(fā)送了USR1信號(hào) 2
進(jìn)入了信號(hào)處理函數(shù)
i=2
已發(fā)送了USR1信號(hào) 3
進(jìn)入了信號(hào)處理函數(shù)
i=3
已發(fā)送了USR1信號(hào) 4
進(jìn)入了信號(hào)處理函數(shù)
i=4
已發(fā)送了USR1信號(hào) 5
進(jìn)入了信號(hào)處理函數(shù)
i=5
已發(fā)送了USR1信號(hào) 6
進(jìn)入了信號(hào)處理函數(shù)
i=6
已發(fā)送了USR1信號(hào) 7
進(jìn)入了信號(hào)處理函數(shù)
i=7
已發(fā)送了USR1信號(hào) 8
進(jìn)入了信號(hào)處理函數(shù)
i=8
已發(fā)送了USR1信號(hào) 9
進(jìn)入了信號(hào)處理函數(shù)
此時(shí),在shell下使用kill殺死sig1,則根據(jù)sig1的sigTermHandler,sig2會(huì)被殺死。
接受到SIGTERM信號(hào),退出
已發(fā)送了USR1信號(hào) 10
已發(fā)送了USR1信號(hào) 11
已發(fā)送了USR1信號(hào) 12
已發(fā)送了USR1信號(hào) 13
已發(fā)送了USR1信號(hào) 14
已發(fā)送了USR1信號(hào) 15
已發(fā)送了USR1信號(hào) 16
已發(fā)送了USR1信號(hào) 17
但是sig1本身沒(méi)有被殺死,這時(shí)因?yàn)闆](méi)有在sigTermHandler里面重新注冊(cè)signal(SIGTERM,(void (*)( ))sigTermHandler);
執(zhí)行了一次sigTermHandler后,對(duì)SIGTERM的處理恢復(fù)到系統(tǒng)默認(rèn)的處理。
然后再一次執(zhí)行kill,殺死sig1,則sig1被殺死。
--可以看出,如果信號(hào)處理函數(shù)內(nèi)部沒(méi)有exit,則進(jìn)程不會(huì)退出,只是回到原來(lái)被中斷的地方繼續(xù)執(zhí)行。