高级信号发送和接收
sigaction
1.可以让信号处理函数屏蔽信号集
2.可以让信号处理函数在信号响应的同时接收信号源进程信息和附带消息。
sigqueue
可以发送信号并同时发送附带消息。
使用kill函数发送信号,sigaction可以接收到信号发送者的信息,但不能接收到附带消息。
sigaction
1.可以让信号处理函数屏蔽信号集
2.可以让信号处理函数在信号响应的同时接收信号源进程信息和附带消息。
sigqueue
可以发送信号并同时发送附带消息。
使用kill函数发送信号,sigaction可以接收到信号发送者的信息,但不能接收到附带消息。
int sigqueue(
pid_t pid,//进程id
int sig, //信号num
const union sigval value);//附带信息
pid_t pid,//进程id
int sig, //信号num
const union sigval value);//附带信息
getpid();//获取当前进程id
pid_t cpid = fork();//获取当前进程创建的子进程的id
getppid();//子进程中获取父进程id。
子进程信号和定时器信号
避免僵尸进程的出现。
什么样的进程叫做僵尸进程:进程已经结束,但仍然占据进程节点。
为什么会出现僵尸进程:
父进程先于子进程结束。
如何避免僵尸进程出现:
让父进程晚于子进程结束。
1.让父进程等待。sleep();
2.父进程要等到子进程发信号才会结束。
3.父进程调用wait函数。等待子进程死亡前发送SIGCHLD信号解除wait函数的阻塞。
避免僵尸进程的出现。
什么样的进程叫做僵尸进程:进程已经结束,但仍然占据进程节点。
为什么会出现僵尸进程:
父进程先于子进程结束。
如何避免僵尸进程出现:
让父进程晚于子进程结束。
1.让父进程等待。sleep();
2.父进程要等到子进程发信号才会结束。
3.父进程调用wait函数。等待子进程死亡前发送SIGCHLD信号解除wait函数的阻塞。
vfork 创建多个进程。
start 启动线程。
start 启动线程。
waitpid();
alarm(5);//5秒钟后发送14信号。
setitimer();
#include <sys/time.h>
int getitimer(
int which,
struct itimerval *value);
int setitimer(
int which, //ITIMER_REAL
const struct itimerval *value,
struct itimerval *ovalue);
int which,
struct itimerval *value);
int setitimer(
int which, //ITIMER_REAL
const struct itimerval *value,
struct itimerval *ovalue);
struct itimerval {
struct timeval it_interval; /* next value */间隔多久就发送定时器信号。
struct timeval it_value; /* current value */隔多久发送第一个定时器信号
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
int count = 0;
void hand(int s){
if(s == 14)
printf("来定时器信号了!\n"),printf("count = %d\n",count++);
}
int main(){
signal(14,hand);
struct itimerval timer;
timer.it_interval.tv_sec = 3;
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 1;
setitimer(ITIMER_REAL,&timer,NULL);
while(1);
return 0;
}
#include <stdio.h>
#include <signal.h>
void hand(int s){
if(s == 2)
printf("普通信号处理函数!\n");
}
void hander(int s,siginfo_t* info,void* buff){
if(s == 2){
printf("高级信号处理函数!\n");
printf("pid:%d,uid:%d\n",info->si_pid,info->si_uid);
printf("int:%x\n",info->si_int);
printf("ptr:%s\n",(char*)info->si_ptr);
printf("addr:%p\n",info->si_addr);
printf("buff:%d\n",*( (int*)buff ) );
}
}
int main(){
struct sigaction act = {0};
act.sa_handler = hand;
act.sa_sigaction = hander;
act.sa_flags = SA_SIGINFO;
sigaction(2,&act,NULL);
printf("%d\n",getpid());
while(1);
return 0;
}