中断信号,自定义信号
#include <iostream>
#include <signal.h>
using namespace std;
void func(int sig)
{
if(sig == SIGINT)
cout<<"ctrl+c"<<endl;
else
if(sig == SIGUSR1)
cout<<"usr1"<<endl;
else
if(sig == SIGUSR2)
cout<<"usr2"<<endl;
}
int main()
{
cout<<"=========1========="<<endl;
signal(SIGINT, func); //登记信号处理函数
signal(SIGUSR1, func);
signal(SIGUSR2, func);
cout<<"==========2========="<<endl;
for(int i=0; i<20; ++i)
{
sleep(10);
cout<<'.';
}
cout<<"========3========="<<endl;
}
发信号方式一: 向指定进程发信号 kill -USR1 进程号
二: 给自己发信号 raise(信号名)
三: 直接按键盘如 ctrl+c
超时信号
#include <iostream>
#include <signal.h>
using namespace std;
int v=0;
int x=0;
void func(int sig)
{
signal(SIGALRM, func);
cout<<"time out"<<endl;
cout<<"v: "<<v<<endl;
cout<<"x: "<<x<<endl;
exit(0);
}
int main()
{
signal(SIGALRM, func);
int n1;
int n2;
int sum;
alarm(20);
srand(time(NULL));
for(int i=0; i<10; i++)
{
n1 = rand()%10;
n2 = rand()%10;
cout<<n1<<"+"<<n2<<"=";
cin>>sum;
if(sum == n1+n2)
++v;
else
++x;
}
cout<<"smart"<<endl;
raise(SIGALRM);
}
子进程退出信号
#include <iostream>
#include <signal.h>
#include <sys/wait.h>
using namespace std;
void func(int sig)
{
signal(SIGCHLD, func);
wait(NULL);
cout<<"wait one child"<<endl;
}
void child(int len, char ch)
{
if(fork() != 0)
return 0;
for(int i=0; i<len; ++i)
{
cout<<ch;
sleep(3);
}
exit(0);
}
int main()
{
signal(SIGCHLD, func);
child(10, '$');
child(20, '*');
for(int i=0; i<100; ++i)
{
cerr<<'^';
sleep(1);
}
}
#include <iostream>
#include <signal.h>
using namespace std;
void func(int sig)
{
if(sig == SIGINT)
cout<<"ctrl+c"<<endl;
else
if(sig == SIGUSR1)
cout<<"usr1"<<endl;
else
if(sig == SIGUSR2)
cout<<"usr2"<<endl;
}
int main()
{
cout<<"=========1========="<<endl;
signal(SIGINT, func); //登记信号处理函数
signal(SIGUSR1, func);
signal(SIGUSR2, func);
cout<<"==========2========="<<endl;
for(int i=0; i<20; ++i)
{
sleep(10);
cout<<'.';
}
cout<<"========3========="<<endl;
}
发信号方式一: 向指定进程发信号 kill -USR1 进程号
二: 给自己发信号 raise(信号名)
三: 直接按键盘如 ctrl+c
超时信号
#include <iostream>
#include <signal.h>
using namespace std;
int v=0;
int x=0;
void func(int sig)
{
signal(SIGALRM, func);
cout<<"time out"<<endl;
cout<<"v: "<<v<<endl;
cout<<"x: "<<x<<endl;
exit(0);
}
int main()
{
signal(SIGALRM, func);
int n1;
int n2;
int sum;
alarm(20);
srand(time(NULL));
for(int i=0; i<10; i++)
{
n1 = rand()%10;
n2 = rand()%10;
cout<<n1<<"+"<<n2<<"=";
cin>>sum;
if(sum == n1+n2)
++v;
else
++x;
}
cout<<"smart"<<endl;
raise(SIGALRM);
}
子进程退出信号
#include <iostream>
#include <signal.h>
#include <sys/wait.h>
using namespace std;
void func(int sig)
{
signal(SIGCHLD, func);
wait(NULL);
cout<<"wait one child"<<endl;
}
void child(int len, char ch)
{
if(fork() != 0)
return 0;
for(int i=0; i<len; ++i)
{
cout<<ch;
sleep(3);
}
exit(0);
}
int main()
{
signal(SIGCHLD, func);
child(10, '$');
child(20, '*');
for(int i=0; i<100; ++i)
{
cerr<<'^';
sleep(1);
}
}