Linux进程间通信——信号( 二 )
文章插图- int sigpending(sigset_t *set);功能: sigpending读取当前进程的未决信号集 , 通过set参数传出 。 返回值:若成功则为0 , 若出错则为-1
- void abort(void);头文件:功能:向进程发送sigabort信号 , 默认情况下进程会异常退出 , 当然可定义自己的信号处理函数 。 说明:即使sigabort被进程设置为阻塞信号 , 调用abort()后 , sigabort仍然能被进程接收 。 该函数无返回值
#include #include #include #include #include void printf_ped(sigset_t* ped){ int i; for (i = 0; i < 32; i++) {if (sigismember(ped, i) == 1){putchar('1');}else{putchar('0');} } printf("\n");}int main(void){ sigset_t myset, oldset, ped_set; sigemptyset(//清空信号集为0 sigaddset(//添加信号到信号集中 sigprocmask(SIG_BLOCK,//设置进程的信号屏蔽字 while (1) {sigpending(//读取未决信号集到ped_set中printf_ped(//打印打印未决信号集sleep(3); } return 0;} 运行结果如下
文章插图一开始没有产生信号 未决信号集都为0 , 当我们按下crtl+\时产生3号信号 , 但是由于我们屏蔽了3号信号 , 未决信号集中第三位一直为1 , 表示该信号还未被处理
定时器相关函数头文件 #include
alarm函数
- 每个进程只有一个alarm
- 无论进程处于何种状态下 , 定时器都在计时
功能:专门为sigalrm信号而设 , 在指定的时间seconds秒后 , 将向进程本身发送sigalrm信号
返回值:如果调用alarm()前 , 进程中已经设置了闹钟时间 , 则返回上一个闹钟时间的剩余时间 , 否则返回0
说明:进程调用alarm后 , 任何以前的alarm()调用都将无效
setitimer函数函数原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
参数:第一个参数 which指定定时器类型第二个参数 结构itimerval的一个实例第三个参数 可不做处理 , old_value一般设为NULL
结构体类型如下
struct itimerval {struct timeval it_interval; /* 下一次的取值 */struct timeval it_value; /* 本次的设定值 */};struct timeval {long tv_sec; /* 秒 */long tv_usec; /* 微秒 , 1秒 = 1000000 微秒*/};功能:这个函数可以周期性计时 , 定时器将it_value递减到0时 , 产生一个信号 , 并将it_value的值设定为it_interval的值 , 然后重新开始计时 , 如此往复 , 若it_interval为0则定时器停止 。 参数ovalue如果不为空 , 则其中保留的是上次调用设定的值返回值:成功返回0 , 失败返回-1
定时器类型:itimer_real: 按实际时间计时(系统时间+用户时间+等待时间) , 经过指定的时间后 , 内核将发送SIGALRM信号给本进程itimer_virtual :只计算进程占用cpu的时间,经过指定的时间后 , 内核将发送SIGVTALRM信号给本进程itimer_prof :计算占用cpu及执行系统调用的时间 , 经过指定的时间后 , 内核将发送SIGPROF信号给本进程
写个例子 , 每3秒打印一次hello world
#include #include #include #include void myfun(int signo){ printf("hello world\n");}int main(){ struct itimerval it, oldit; int ret; signal(SIGALRM, myfun); //本次设定值 it.it_value.tv_sec = 3; it.it_value.tv_usec = 0; //下次设定值 it.it_interval.tv_sec = 3; it.it_interval.tv_usec = 0; ret = setitimer(ITIMER_REAL,if (ret == -1) {printf("error\n");exit(1); } while (1); return 0;} 运行结果
文章插图- 星期一|亚马逊:黑五与网络星期一期间 第三方卖家销售额达到48亿美元
- 空间|垃圾文件正在吞噬你的C盘空间用这四种方法,还你一个干净的C盘
- 广告点击|广告效果评估:30天的广告时间评估最全面
- 要来|折叠屏iPhone终于要来了!可惜发布的时间有点晚,你愿意等吗?
- 智能手机品|越南手机悄然崛起!创立短短2年时间,在当地接连击退苹果、小米
- 科技|短视频行业领先 云想科技成长空间广阔
- 黑色|亚马逊黑色星期五及网购星期一期间全球第三方卖家销售额超48亿美元
- 移植|开发者将移植ARM Mac的Linux系统 但需要得到资金支持
- 网间|新外观专利陆续曝光 徐起和网间透露realme极致性能新机将至
- Android|索尼Android 11更新时间表公布 最早本月开始
