linux高级信号发送和接收(附带消息)

高级信号发送和接收
 sigaction
  1.可以让信号处理函数屏蔽信号集
  2.可以让信号处理函数在信号响应的同时接收信号源进程信息和附带消息。
 sigqueue
  可以发送信号并同时发送附带消息。
  使用kill函数发送信号,sigaction可以接收到信号发送者的信息,但不能接收到附带消息。
 int  sigqueue(
 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函数的阻塞。
 vfork 创建多个进程。
 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);

    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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值