linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/9 21:56:12/文章来源:https://blog.csdn.net/weixin_42131790/article/details/116640309

1.简介

如果进程要处理某一信号,那么要在进程中注册该信号。注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作。主要有两个函数实现信号的注册:signal()和sigaction()。

2.signal()

signal()的函数原型如下:

void (*signal(int signum, void (*handler)(int)))(int);

在使用该调用的进程中加入以下头文件:

#include

上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下手册。在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是

SIG_IGN:忽略参数signum所指的信号。

SIG_DFL:恢复参数signum所指信号的处理方法为默认值。

传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal()返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。

signal()通过系统调用sys_signal()为一个指定的信号设置用户态处理函数。sys_signal()定义如下:

/*

* For backwards compatibility.  Functionality superseded by sigaction.

*/

asmlinkage unsigned long

sys_signal(int sig, __sighandler_t handler)

{

struct k_sigaction new_sa, old_sa;

int ret;

new_sa.sa.sa_handler = handler;

new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;

ret = do_sigaction(sig, &new_sa, &old_sa);

return ret ? ret : (unsigned long)old_sa.sa.sa_handler;

}

__sighandler_t的定义如下:

typedef void __signalfn_t(int);

typedef __signalfn_t __user *__sighandler_t;

信号由sys_signal()的第一个参数指定,信号处理函数的地址由第二个参数指定。sys_signal()根据这两个参数设置一个k_sigaction结构,然后调用do_sigaction(),该函数的定义我们会在后面具体讲解。

2.sigaction()

sigaction()的函数原型如下:

sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

sigaction()对应的系统调用为do_sigaction(),下面我们具体讲解do_sigaction()函数,其定义如下:

2.1do_sigaction()

int

do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact)

{

struct k_sigaction *k;

if (!valid_signal(sig) || sig < 1 || (act && sig_kernel_only(sig)))

return -EINVAL;

k = &currentt->sighand->action[sig-1];

spin_lock_irq(&currentt->sighand->siglock);

if (signal_pending(current)) {

/*

* If there might be a fatal signal pending on multiple

* threads, make sure we take it before changing the action.

*/

spin_unlock_irq(&currentt->sighand->siglock);

return -ERESTARTNOINTR;

}

if (oact)//把原来的k_sigaction保存到oact结构中,这里是对整个数据结构进行复制

*oact = *k;

if (act) {

/*

* POSIX 3.3.1.3:

*  "Setting a signal action to SIG_IGN for a signal that is

*  pending shall cause the pending signal to be discarded,

*  whether or not it is blocked."

*

*  "Setting a signal action to SIG_DFL for a signal that is

*  pending and whose default action is to ignore the signal

*  (for example, SIGCHLD), shall cause the pending signal to

*  be discarded, whether or not it is blocked"

*/

if (act->sa.sa_handler == SIG_IGN ||

(act->sa.sa_handler == SIG_DFL &&

sig_kernel_ignore(sig))) {

/*

* This is a fairly rare case, so we only take the

* tasklist_lock once we're sure we'll need it.

* Now we must do this little unlock and relock

* dance to maintain the lock hierarchy.

*/

struct task_struct *t = current;

spin_unlock_irq(&t->sighand->siglock);

read_lock(&tasklist_lock);

spin_lock_irq(&t->sighand->siglock);

*k = *act; //把新的k_sigaction结构复制到进程的sighand->action中

sigdelsetmask(&k->sa.sa_mask,

sigmask(SIGKILL) | sigmask(SIGSTOP));

rm_from_queue(sigmask(sig), &t->signal->shared_pending);

do {

rm_from_queue(sigmask(sig), &t->pending);

recalc_sigpending_tsk(t);

t = next_thread(t);

} while (t != current);

spin_unlock_irq(&current->sighand->siglock);

read_unlock(&tasklist_lock);

return 0;

}

*k = *act; //把新的k_sigaction结构复制到进程的sighand->action中

sigdelsetmask(&k->sa.sa_mask,

sigmask(SIGKILL) | sigmask(SIGSTOP));

}

spin_unlock_irq(&currentt->sighand->siglock);

return 0;

}0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_780062.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东方通 启动服务访问不到_网站无法访问了怎么办?通用排查思路了解一下

你是否遇到过下面这些问题&#xff1f;访问站点时&#xff0c;报“无法访问此网站”的错误&#xff0c;没有错误状态码&#xff1f;网站忽然无法访问&#xff0c;出现异常代码4XX&#xff1f;网站访问非常缓慢&#xff0c;猜测是数据库连接数问题&#xff1f;网站无法访问的原因…

php后台框架下载,caozha-admin(PHP网站后台管理框架)

caozha-admin是一个通用的PHP网站后台管理框架&#xff0c;基于开源的ThinkPHP开发&#xff0c;特点&#xff0c;易上手&#xff0c;零门槛&#xff0c;界面清爽极简&#xff0c;极便于二次开发。相关软件软件大小版本说明下载地址caozha-admin是一个通用的PHP网站后台管理框架…

php7.0的mvc项目,MVC4.0网站发布和部署到IIS7.0上的方法

最近在研究MVC4&#xff0c;使用vs2010&#xff0c;开发的站点在发布和部署到iis7上的过程中遇到了很多问题&#xff0c;现在将解决的过程记录下来&#xff0c;以便日后参考&#xff0c;整个过程主要以截图形式呈现vs2010的安装和mvc4的安装不在本次记录之列&#xff0c;主要记…

文件拷贝到当前工作目录linux,linux中拷贝文件到指定目录的命令是什么_网站服务器运行维护,linux,文件,目录,命令...

ubuntu如何进入命令行界面_网站服务器运行维护ubuntu进入命令行界面的方法是&#xff1a;1、进入ubuntu主界面&#xff1b;2、按下【ctrlaltF2~F6】组合键&#xff1b;3、输入需要登录的账户和密码&#xff0c;回车&#xff0c;这样就成功切换到命令行界面了。linux中拷贝文件到…

LAMP网站架构方案分析

LAMP&#xff08;Linux-Apache-MySQL-PHP&#xff09;网站架构是目前国际流行的Web框架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;Perl、PHP或者Python编程语言&#xff0c;所有组成产品均是开源软件&a…

CDN是什么,CDN对网站的作用?

CDN是什么 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其目的是广泛采用各种缓存服务器&#xff0c;将这些缓存服务器分布到用户访问相对集中的地区或网络中&#xff0c;在用户访问网站时&#xff0c;利用全局负载技术将用户的访问指向距离最近的工作正…

setoolkit——克隆网站及利用

0. 切换root用户 我们先切换到root用户&#xff0c;再去启动工具。 密码为登录kali时所使用的密码 sudo -i 1. setoolkit 启动 启动成功 2. 选择Social-Engineering Attacks 3. 选择Website Attack Vectors 4. 选择Credential Harvester Attack Method 5. 选择Site Cloner …

什么是网站被黑了?网站被黑客攻击怎么办?

什么是网站被黑&#xff1f;一般来说&#xff0c;我们所谈论的网站都被黑客入侵&#xff0c;这意味着黑客利用网站背景中的一些程序漏洞进行攻击。他们会在我们的网站上添加很多垃圾页面。当您检查包含某个网站时&#xff0c;如果该网站被黑客攻击&#xff0c;则会显示一些内容…

企业网站,公司网站,门户网站。建设好之后还要干什么?

创业开始&#xff0c;企业网站也花钱做好了&#xff0c;产品也上传了&#xff0c;图片也发布了&#xff0c;可是就是没效果怎么回事&#xff1f; 为什么别人做网站都能找到客户&#xff0c;而我们做好网站之后似乎什么也没发生&#xff0c;一年过去了&#xff0c;还是老样子&am…

免备案高防CDN节点解决海外网站安全问题

在互联网高速发展的环境下&#xff0c;网络与经济息息相关&#xff0c;然而一些不法黑客和病毒的存在极大的危害到网络安全。特别是用户在海外服务器租用的时候&#xff0c;这个时候就需要用到cdn防御。 当前许多行业都依附于互联网发展&#xff0c;如金融、游戏、电商等&…

为什么网站有时出现“Service Unavailable”的提示?

出现这种情况是由于您的网站超过了系统资源限制造成的&#xff0c;主要是程序占用资源太多。一种是IIS超出最大连接数,这种你需要联系客户人员升级IIS,另一种是程序占用资源太多的原因如下&#xff1a; 1、有一个或多个ACCESS数据库在多次读写过程中损坏&#xff0c;微软的MDA…

服务器影响你网站4个因素

中小企在选择服务器架设网站时&#xff0c;切勿贪小便宜以及没三思而后行&#xff0c;无论你的网站做得多好看&#xff0c;若你没有慎重地选择你的服务器&#xff0c;那么你将有可能后悔&#xff0c;这不仅仅只是将你的网站寄存在服务器供应商那&#xff0c;而是关联到你网站的…

一篇报道告诉你什么是CDN,CDN对网站的作用?

CDN是什么 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其目的是广泛采用各种缓存服务器&#xff0c;将这些缓存服务器分布到用户访问相对集中的地区或网络中&#xff0c;在用户访问网站时&#xff0c;利用全局负载技术将用户的访问指向距离最近的工作正…

网站更换服务器的操作方法

大家的网站由于各种原因需要更换服务器&#xff0c;有做过seo的人就会担心更换服务器影响网站排名吗?服务器对于网站的重要性不言而喻&#xff0c;更好服务器势必会对网站的排名产生一定的影响。那么网站更换服务器时如何把影响降到最少,下面为大家提供网站更换服务器的详细方…

频繁更换服务器IP对网站的影响

如果你的空间服务商频繁地、不定期地通知您修改域名解析的指向IP&#xff0c;或者干脆强制您必须使用cname方式解析您的域名&#xff0c;那么你就要留意了。这种情况一般发生在使用海外服务器上&#xff0c;原因可能有二&#xff1a;1、IP被封——服务器IP在国内被封&#xff0…

动态网站是如何实现网站加速的。

CDN即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输的更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟主网络&#xff0c;CDN系统能够实时地根据网络流量和各节…

大型网站架构之分布式消息队列

一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境&#xff0…

网站服务器防御恶意攻击的方法

网站服务器防御恶意攻击的方法&#xff01;随着互联网络带宽的增多和多种ddos攻击黑客工具的不断发布&#xff0c;使其ddos攻击越来越频繁。如今DDoS攻击已不单单只出现在大型网站中&#xff0c;很多中小型网站甚至是个人网站都可能面临着被DDoS攻击的风险。发动ddos攻击的原因…

选择服务器后怎么确保网站安全?

当企业网站完成了服务器的选择&#xff0c;是选择云主机还是VPS还是虚拟主机&#xff0c;它就完成了搭建的一大部分。当网站成功建好之后&#xff0c;我们要做些什么才能够确保网站的运作安全? 1、定期检查网络情况。除了选择信誉良好的计算机房外&#xff0c;还需要定期检查…

DDoS攻击怎样让网站打不开的?

如果您对DDoS攻击有所了解&#xff0c;您很可能已经注意到DDoS攻击会如何危害您的网站。DDoS攻击通过拖延业务和使网站脱机而对全球的企业和网站造成严重破坏。根据NSFOCUS发布的报告显示&#xff1a;全球每两分钟平均发生1.29次DDoS攻击&#xff0c;其中&#xff0c;93.2%的DD…