Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40076
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-28 17:39
文章分类
文章存档

2015年(31)

我的朋友

分类: C/C++

2015-11-01 16:31:32

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;
};
阅读(541) | 评论(0) | 转发(0) |
0

上一篇:部分文件函数

下一篇:进程

给主人留下些什么吧!~~