当前位置: 首页 > news >正文

网站开发 链接指向文件夹郴州市人力资源考试网

网站开发 链接指向文件夹,郴州市人力资源考试网,淘宝站内推广方式有哪些,wordpress 注册用户 邮件信号(signal) 信号是什么?信号非常常见,上课铃声,红绿灯,鸣笛等都是信号。操作系统中也有信号,为什么操作系统要设置信号,这是为了保护操作系统,防止用户进行操作时&…

信号(signal)

信号是什么?信号非常常见,上课铃声,红绿灯,鸣笛等都是信号。操作系统中也有信号,为什么操作系统要设置信号,这是为了保护操作系统,防止用户进行操作时,采取了某些办法,导致系统软硬件出现异常。

那么信号如何产生

  1. 键盘。在linux操作系统下,通过ctrl+c,ctrl+z等组合键可以产生信号。
  2. 通过输入kill命令。linux下,通过命令行输入kill -sig pid可以向操作系统的某个pid进程发送sig号的信号。例如:kill -9 2955
    这里写图片描述
    这里写图片描述这里有一个test的进程在运行,发送kill -9 2955后进程被终止。
  3. 软硬件发送信号。某些操作可能导致软硬件出现错误,于是会通过操作系统向用户发送信号。
  4. 库函数kill()函数。不做详细解释

本节主要讲信号的操作,不对信号的产生,收信号做详细的解释。

信号操作

信号集就是pcb中信号的字段,用位图来表示。

int sigemptyset(sigset_t *set);//初始化信号集为空
int sigfillset(sigset_t *set);//充满信号集
int sigaddset(sigset_t *set, int signo);//添加信号int sigdelset(sigset_t *set, int signo);//解除信号
int sigismember(const sigset_t *set, int signo);//查看信号是否在信号集中存在

这些函数都是用户上的函数,真正阻塞系统信号的是sigprocmask();

int sigprocmask(int how, const sigset_t *set, sigset_t *oset);//how*set设为修改的信号集,*oset,旧的信号集(未修改的)

how三种方式:

  1. SIG_BLOCK,设置为阻塞方式。
  2. SIG_UNBLOCK,解除阻塞信号。
  3. SIG_SETMASK,设置当前信号字为set所指的值。

    sigpending

int sigpending(sigset_t *set);

sigpending读取当前进程的未决信号集,通过set参数传出。调⽤用成功则返回0,出错则返回-1。
下面为信号屏蔽与解除的示例:

#include <signal.h>
#include <stdlib.h>
void printsigset(sigset_t *nset)
{int i = 1;for(;i<32;i++){if(sigismember(nset,i)){printf("1");}else{printf("0");}}printf("\n");
}
int main()
{sigset_t nset,oset;sigemptyset(&nset);sigemptyset(&oset);sigaddset(&nset,2);sigprocmask(SIG_SETMASK,&nset,&oset);while(1){sigpending(&nset);printsigset(&nset);sleep(1);}return 0;
}

这段代码给信号集加入了2号信号,如果收到2号打印1,没有打印0.

下面编写了一个mysleep函数模拟实现sleep函数。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void handler(int sig)
{
}
int mysleep(int timeout)
{struct sigaction nset,oset;nset.sa_flags = 0;nset.sa_handler = handler;sigemptyset(&nset.sa_mask);sigaction(SIGALRM,&nset,&oset);alarm(timeout);pause();sigaction(SIGALRM,&oset,NULL);
}
int main()
{while(1){printf("hello world\n");mysleep(1);}return 0;
}

这段代码通过调用pause进程挂起,捕捉到信号错误返回,与alarm闹钟函数结合模拟实现。
这段代码还有很大问题,当alarm函数完成后,进程切出去执行别的进程而没有被挂起,闹钟响后,将会持续保持pause状态,而一直运行。
解决办法是:
屏蔽alarm信号,调用sigsuspend(sigset_t *set)函数实现pause与解除信号的原子性。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void handler(int sig)
{
}
int mysleep(int timeout)
{struct sigaction nset,oset;sigset_t oldset,newset,susp;sigemptyset(&newset);sigaddset(&newset,SIGALRM);sigprocmask(SIG_BLOCK,&newset,&oldset);nset.sa_flags = 0;nset.sa_handler = handler;sigemptyset(&nset.sa_mask);sigaction(SIGALRM,&nset,&oset);alarm(timeout);susp = oldset;sigdelset(&susp,SIGALRM);sigsuspend(&susp);sigaction(SIGALRM,&oset,NULL);int ret = alarm(0);return ret;
}
int main()
{while(1){printf("hello world\n");mysleep(1);}return 0;
}

信号屏蔽与解除与上述示例。

http://www.yayakq.cn/news/204462/

相关文章:

  • 做微商网站的软文商业网站设计专业
  • 网站推广问题简单的静态网站首页
  • 金泉网 网站建设计算机自学app
  • 中山 网站建设和wordpress类似的源码
  • 河北邢台做wap网站梧州网站建设有哪些
  • 公司网站设计意见收集品牌公关案例
  • 网站编写wordpress iis 404页面
  • 厦门网站建设公司推荐河北省建设机械会网站首页
  • wordpress文章中出站网站空间 默认文档
  • 常州微信网站建设价位学校网站建设材料
  • 盐城手机网站建设域名续费一般多少钱一年
  • 徐州网站建设多少钱开发商破产了购房者怎么办
  • 珠海网站seo旅游网站建设技术解决方案
  • 闵行广州网站建设上海注册设计公司网站
  • 门户网站建设方案中信息公开做网站可以临摹吗
  • 国外做蒸汽锅炉的网站网站规划与建设进度
  • .湖南省建设厅规范网站品牌网站建设 蝌蚪小7
  • 网站开发计算机配置做那个网站比较好
  • 网站问责建设书wix做网站教程
  • 浙江建设工程考试网站一般网站建设步骤
  • 网页制作中网站名称怎么做百度关键词排名神器
  • 网站快速收录入口建立网站解析会员视频是犯什么罪
  • dedecms 金融类网站模板北京房产网站建设
  • 网站内容和功能清单自己怎么创建免费网站吗
  • 做网站插背景图片如何变大网站建设推广优化排名
  • 做网站软件图标是一个箭头的wordpress盈利
  • 专业网站推广的公司设计专业所需网站
  • 搜索网站做淘宝客极速微网站建设cms
  • 光谷做网站免费软文发布平台
  • 淘宝客推广网站建设茶楼网站