1.
信号:进程运行过程中,自身或进程外部发的消息事件
表示:整形常量宏,以SIG开头
查看:在signal.h文件中定义, 命令 kill -l ,man 7 signal
产生:由内核产生
请求的地方:
用户:ctrl+c ,ctrl+\,
内核:浮点溢出或者非法段访问等程序出错,内核会给发信号给进程
进程:信号函数kill,alarm, setitimer,sigqueue等
处理:
默认:ctrl+c---->SIGINT,使用signal(SIGINT, SIG_DFL)
忽略:ctrl+\ ---->SIGQUIT, 使用signal(SIGQUIT, SIG_IGN)
捕捉处理:注册信号处理函数
SIGKILL和SIGSTOP只能默认处理,终止进程。
2.signal:
typedef void (*sighandler_t)(int);
sighandler_t signal(int sigNo, sighandler_t handler);
2.1处理情况:
2.1.1信号处理函数只需注册一次,
2.1.2信号A处理函数在执行,则期间产生的信号A只保留一个,只有等在执行的A完成后才能执行。
2.1.3在A处理过程中,发生别的信号B,则执行B的处理函数。B处理期间发生多个A和B信号,则要处理完B(包括第二个B)后去执行A(未完成的,还有新产生的)。
2.1.4阻塞的系统调用,比如read,在中断信号前后都有输入,读取时只有中断后输入的部分
3.
int sigaction(int sigNo, const struct sigaction *act , struct sigaction *oldact);
struct sigaction
{
void (*sa_handler_t)(int); //signal的函数处理指针
void (*sa_sigaction)(int , siginfo_t*, void *); //sigaction的函数处理指针
sigset_t sa_mask; //被阻塞的信号集合
int sa_flags; //SA_SIGINFO--->sa_sigaction, 0----->sa_handler_t
void (*sa_restorer)(void); //reserved
};
函数指针sa_sigaction原型:
void hander(int sigNo, siginfo_t *pSignInfo, void *pReserved);
sigNo:信号
pSignInfo:信号的信息结构体
pReserved:保留
阻塞的信号集sigset_t sa_mask:
int sigemptyset(sigset_t *set); //清空
int sigfillset(sigset_t *set); //所有信号添加到set
int sigaddset(sigset_t *set, int signum); //添加一个signum
int sigdelset(sigset_t *set, int signum); //删除signum
int sigismember(const sigset_t *set, int signum); //返回1表示在集合中,0表示不在
int sigpending(sigset_t *set); //将被阻塞的信号由set指针返回
sa_flags:
SA_RESETHAND:信号处理完后要重新注册,一般不用,
SA_NODEFER:递归处理信号,定义这个后则sa_mask无效,一般不用
SA_RESTART:表示处理信号后从阻塞的系统返回,不指定这个参数,则处理完后,阻塞的函数失败;
SA_SIGINFO:指示指针使用sa_sigaction,否则用sa_handler_t
4.信号阻塞
使用siganction中的阻塞集,是指在信号处理函数过程中阻塞。
sigprocmask全程阻塞。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参数how:
SIG_BLOCK:将参数2的集合添加到进程原有的阻塞信号集中
SIG_UNBLOCK:将参数2的集合从进程原有的阻塞信号集中移除
SIG_SETMASK:将参数2的集合设置为阻塞信号集,原有的信号集保存到oldset中
int sigpending(sigset_t *pending_set);//将进程中的阻塞信号全部添加到pending_set信号集中。
5.信号发送函数:
int kill(pid_t pid, int sig);
pid>0: 发送给进程pid
pid==0: 发送给同组的所有进程
pid==-1: 发送给有权发送的进程
pid< -1: 发送给进程组为pid绝对值的所有进程
int sigqueue(pid_t pid, int sig, const union sigval value);
union
{
int sival_int;
void * sival_ptr;
}
发送信号sig给进程pid,内容为value,传入到在信号处理函数第二个参数的结构体中(info->si_ptr, info->si_int)。
6.睡眠
int pause(void); //进程挂起直到有信号为止
unsigned int sleep(unsigned int seconds);
void usleep(unsigned long usec);
unsigned int alarm(unsigned int seconds); //seconds秒后产生SIGALRM信号
7:时钟
真实计时器:运行的实际时间(包括睡眠时间)
虚拟计时器:用户态消耗的时间
实用计时器:用户态和内核态的时间
int getitimer(int which, struct itimerval *value);
which:ITEMER_REAL,ITEMER_VIRTUL,ITEMER_PROF
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
value:指定计时器的初始间隔和重复间隔
ovalue:原来计时器的初始间隔和重复间隔
struct itimerval
{
struct timeval it_interval; //重复间隔
struct timeval it_value; //初始间隔
};
struct timerval
{
long tv_sec;
long tv_usec;
};
阅读(598) | 评论(0) | 转发(0) |