Linux信号实践(2)

是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;}可重入/不可重入函数让我们从自身的禁锢中放心地飞出去,重新审视自己,

Linux信号实践(2)

相关文章:

你感兴趣的文章:

标签云: