是pid(绝对值)的每一个进程
//示例void onSignalAction(int signalNumber){switch(signalNumber){case SIGUSR1:cout << "SIGUSR1 = " << signalNumber << endl;break;default:cout << "Other Signal …" << endl;break;}}int main(){if (signal(SIGUSR1,onSignalAction)== SIG_ERR){perror("signal error");return -1;}pid_t pid = fork();if (pid == -1){perror("fork error");return -1;}else if (pid == 0){/**向父进程发送信号pid_t ppid = getppid();kill(ppid,SIGUSR1);*//**向同组所有进程发送信号,子进程也会收到该信号kill(0,SIGUSR1);*///向本组所有进程发送信号,作用同上//getpgrp()函数获取进程组pidpid_t pgid = getpgrp();killpg(pgid,SIGUSR1);exit(0);}int sleepTime = 3;while (sleepTime > 0){write(STDOUT_FILENO,"Parent start Sleep…\n",sizeof("Parent start Sleep…\n"));sleepTime = sleep(sleepTime);write(STDOUT_FILENO,"Parent return from Sleep…\n",sizeof("Parent return from Sleep…\n"));}return 0;}
注意:如果在fork之前安装信号,则子进程可以继承信号。
Sleep遇上signal,子进程向父进程发送信号,sleep函数的几点说明
1)sleep函数作用,让进程睡眠。
2)能被信号打断,然后处理信号函数以后,就不再睡眠了。直接向下执行代码
3)sleep函数的返回值,是剩余的秒数
Man手册显示:
RETURNVALUE
Zeroiftherequestedtimehaselapsed,orthenumberofsecondslefttosleep,
ifthecallwasinterruptedbyasignalhandler.
//示例:sleep遇上signalvoid onSignalAction(int signalNumber){switch(signalNumber){case SIGINT:cout << "SIGINT = " << signalNumber << endl;break;default:cout << "Other Signal …" << endl;break;}}int main(){if (signal(SIGINT,onSignalAction)== SIG_ERR){perror("signal error");return -1;}cout << "Main Start Sleeping…" << endl;int returnValue = sleep(100); //可中断睡眠cout << "Main End Sleeping… returnValue = " << returnValue << endl;return 0;}//示例:sleep加强int main(){//…同上cout << "Main Start Sleeping…" << endl;//sleep加强版^^int sleepTime = 20;do{sleepTime = sleep(sleepTime);cout << "continue…" << endl;}while (sleepTime > 0);cout << "Main End Sleeping… sleepTime = " << sleepTime << endl;return 0;}
2.raise
int raise(int sig);
给自己发送信号。raise(sig)等价于kill(getpid(),sig);
3.killpg
int killpg(int pgrp, int sig);
给进程组发送信号。killpg(pgrp,sig)等价于kill(-pgrp,sig);
4.sigqueue
int sigqueue(pid_t pid, int sig, const union sigval value);
给进程发送信号,支持排队,可以附带信息。
信号API-pause
int pause(void);
将进程置为可中断睡眠状态。然后它调用内核函数schedule(),使Linux进程调度器找到另一个进程来运行。
pause使调用者进程挂起,,直到一个信号被捕获
//示例int main(){if (signal(SIGINT,handler)== SIG_ERR)err_exit("signal error");while(true){pause();cout << "pause return…" << endl;}}信号API-信号发送(2)unsigned int alarm(unsigned int seconds);
alarm函数,设置一个闹钟延迟发送SIGALRM信号(告诉Linux内核n秒中以后,发送SIGALRM信号);
手册描述-DESCRIPTION
alarm()arrangesforaSIGALRMsignaltobedeliveredtotheprocessinsecondsseconds.
Ifsecondsiszero,nonewalarm()isscheduled.
Inanyeventanypreviouslysetalarm()iscancelled.
//alarm 递归调用void onSignalAction(int signalNumber){switch(signalNumber){case SIGALRM:cout << "SIGALRM = " << signalNumber << endl;alarm(1);//继续调用onSignalActionbreak;default:cout << "Other Signal …" << endl;break;}}int main(){if (signal(SIGALRM,onSignalAction)== SIG_ERR){perror("signal error");return -1;}alarm(1);while(true){pause();cout << "pause returned…" << endl;}return 0;}可重入/不可重入函数让我们从自身的禁锢中放心地飞出去,重新审视自己,