我试图通过我在网上找到的示例程序来了解信号在 Linux 中的工作方式,但它有一些我不太了解的部分。
这是我的示例程序:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void catcher(int sig) {
printf("catcher() has gained control\n");
}
int main(int argc, char *argv[]) {
struct sigaction sigact;
sigset_t sigset;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigact.sa_handler = catcher;
sigaction(SIGUSR1, &sigact, NULL);
printf("before first kill()\n");
kill(getpid(), SIGUSR1);
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_SETMASK, &sigset, NULL);
printf("before second kill()\n");
kill(getpid(), SIGUSR1);
printf("after second kill()\n");
return 0;
}
这是我程序的示例输出:
before first kill()
catcher() has gained control
before second kill()
after second kill()
我能知道为什么输出中的第一行是 before first kill() 吗?为什么 catcher() has gained control 没有先出现?
据我所知,sa_handler 由两种类型的信号组成,信号默认和信号忽略。
我们怎么知道它会产生哪个信号?如果忽略生成的信号,为什么会触发打印 catcher() 已获得控制权的函数?
另外,这个程序中的sa_mask函数是什么?在我的理解中,sa_mask 将阻止指定的信号。
最佳答案
Can I know why the first line in the output is before first kill()? Why doesn't catcher() has gained control appear first?
您安装了一个信号处理程序来捕获 SIGUSR1。在 SIGUSR1 被传递给进程之前,正常的程序执行流程一直在发生。所以,在这里:
printf("before first kill()\n");
kill(getpid(), SIGUSR1);
您仅在打印before first kill() 之后生成信号。您为什么不希望它在 catcher() 获得控制权 之前出现?换句话说,当你调用 printf("before first kill()\n"); 时,还没有发出信号,所以你只能期望程序执行保持正常。
这一行:
kill(getpid(), SIGUSR1);
生成 SIGUSR1。操作系统在方便的时候将信号传递给进程。因为您为 SIGUSR1 安装了一个处理程序,所以您的信号处理程序 (catcher()) 被调用。您在打印第一行后发出信号,因此可以预期下一行输出将来自信号处理程序。
请注意 printf(3) 不是异步信号安全的,因此从技术上讲您不能从信号处理程序内部调用它,但对于这些玩具示例来说通常没问题。
From what I know, sa_handler consists of two types of signal, signal default and signal ignore.
不止于此。 struct sigaction的sa_handler字段可以取值为SIG_DFL,对应默认信号 Action (默认 Action 在中列出) man signal) 和 SIG_IGN,这意味着信号被忽略(发出时什么也没有发生)。但是 sa_handler 也可以是指向您希望在每次传递信号时调用的函数的指针。这就是您显示的代码正在做的事情 - 它说:嘿,当 SIGUSR1 交付时,请调用 catcher()。 p>
How do we know which signal it will generate? Why would it trigger the function to print the catcher() has gained control if the signal ignore being generate?
当您调用 sigaction(2) 设置处理程序时,您指示了一个信号 (SIGUSR1)。因此,catcher() 将在 SIGUSR1 被传送时被调用。
Besides, what is the sa_mask function in this program? In my understanding, sa_mask will block the specified signal.
这是一个信号掩码,在进入信号处理程序时自动安装,并在信号处理程序返回时卸载。默认情况下,即使您向它传递一个空掩码,被捕获的信号在进入处理程序时始终会被阻止(除非 SA_NODEFER 标志在 sa_flags 字段中设置 结构sigaction)。但是,您可能希望在处理程序执行时阻止其他信号 - 您可以通过在 sa_mask 中指示这些信号来实现。
关于c - linux 中 c 的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156258/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/
目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法 实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l