- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据手册页:
如果您想以可移植的方式保存和恢复信号掩码,请使用 sigsetjmp()
和 siglongjmp()
。
sigsetjmp()
类似于setjmp()
。当且仅当 savesigs
为非零时,进程的当前信号掩码保存在 env
中并将 如果稍后使用此 env
执行 siglongjmp(3)
,则恢复。
但是在我的程序中上面的陈述不正确或者我遗漏了什么?当 sigsetjmp
被调用时和当 siglongjmp
返回时掩码信号是不一样的。我在整个代码中都写了评论来详细解释这个问题。我的问题是为什么会这样?
提前致谢
#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
sigjmp_buf env;
static void handler(int signo)
{
printf("\ncatched signal: %d\n", signo);
siglongjmp(env,1);
}
int main(void)
{
struct sigaction action;
action.sa_flags = 0;
action.sa_handler = handler;
if( (sigemptyset(&action.sa_mask) == -1) || (sigaction(SIGINT, &action, NULL) == -1) )
{
perror("Failed to set!");
return 1;
}
printf("this is process %ld\n", (long)getpid());
//here I add the SIGSEGV to mask signals i.e action.sa_mask
sigaddset(&action.sa_mask,SIGSEGV);
sigaction(0, &action, NULL);
sigaction(0, 0 , &action);
printf("\nsigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> %d\n", sigismember(&action.sa_mask, SIGSEGV)? 1 : 0);
//and yes it is member of mask signals i.e action.sa_mask
if(sigsetjmp(env,1)) //"first time" it saves state of registers and mask signals and as return value is 0 it does not go inside
{
//when it comes here due to siglongjmp() the signal masks must be restored
printf("Return to main loop due to ^c\n");
//so again SIGSEGV must be member of mask signal i.e action.sa_mask as it was removed only after sigsetjmp was called
sigaction(0 , 0 , &action);
printf("sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> %d\n", sigismember(&action.sa_mask, SIGSEGV)? 1 : 0);
//but it shows it is NOT member of mask signal i.e action.sa_mask. why???
}
//here I delete the SIGSEGV from mask signals i.e action.sa_mask
sigdelset(&action.sa_mask,SIGSEGV);
sigaction(0, &action, NULL);
sigaction(0, 0 , &action);
printf("\nsigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> %d\n\n", sigismember(&action.sa_mask, SIGSEGV)? 1 : 0);
for(;;);
}
输出:
majid@K53SC:~/Desktop$ ./a.out
this is process 6335
sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> 1
sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> 0
^C
catched signal: 2
Return to main loop due to ^c
sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> 0
sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> 0
^C
catched signal: 2
Return to main loop due to ^c
sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> 0
sigismember(&action.sa_mask, SIGSEGV)? 1 : 0 -> 0
编辑
我发布了一个正确的程序来展示sigsetjmp()
和siglongjmp()
的概念以及信号如何mask 被恢复
,它是根据 Mr. Jean-Baptiste Yunès 在答案部分给出的答案输出的,因此可能对其他人有帮助:
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
sigjmp_buf env;
void handler(int signo)
{
printf("\nCaught signal: %s", strsignal(signo));
siglongjmp(env,1);
}
int main(void)
{
sigset_t pmask;
if( (sigemptyset(&pmask) == -1) || (signal(SIGINT, handler)== SIG_ERR) )
{
perror("Failed to set!");
return 1;
}
sigprocmask(SIG_SETMASK, &pmask, NULL); //set the process signal mask to pmask
sigprocmask(0, NULL, &pmask); //check the process mask in pmask
printf("\nsigismember(&pmask, SIGSEGV)? 1 : 0 -> %d", sigismember(&pmask, SIGSEGV)? 1 : 0);
if(sigsetjmp(env,1)!=0) //save process environment context and signal mask
printf("\nReturn from signal handler to main loop\nProcess signal mask is restored by siglongjmp()!\n");
else
printf("\nProcess signal mask is saved by sigsetjmp()!\n");
printf("\n**** This is process %ld ****", (long)getpid());
sigprocmask(0, NULL, &pmask); //ckeck the process mask to mask
printf("\nsigismember(&pmask, SIGSEGV)? 1 : 0 -> %d", sigismember(&pmask, SIGSEGV)? 1 : 0);
printf("\nChanging process signal mask");
sigaddset(&pmask,SIGSEGV);
sigprocmask(SIG_SETMASK, &pmask, NULL);
sigprocmask(0, NULL, &pmask); //ckeck the process mask to mask
printf("\nsigismember(&pmask, SIGSEGV)? 1 : 0 -> %d\n\n", sigismember(&pmask, SIGSEGV)? 1 : 0);
pause();
}
输出
majid@K53SC:~/Desktop$ gcc P45.c
majid@K53SC:~/Desktop$ ./a.out
sigismember(&pmask, SIGSEGV)? 1 : 0 -> 0
Process signal mask is saved by sigsetjmp()!
**** This is process 23099 ****
sigismember(&pmask, SIGSEGV)? 1 : 0 -> 0
Changing process signal mask
sigismember(&pmask, SIGSEGV)? 1 : 0 -> 1
^C
Caught signal: Interrupt
Return from signal handler to main loop
Process signal mask is restored by siglongjmp()!
**** This is process 23099 ****
sigismember(&pmask, SIGSEGV)? 1 : 0 -> 0
Changing process signal mask
sigismember(&pmask, SIGSEGV)? 1 : 0 -> 1
最佳答案
这是因为您没有打印正确的信息。您只需打印 action.sa_mask
这是正确的行为,因为您通过从中删除 SIGSEGV
来更改它。
你想要的是通过sigprocmask
打印可用的进程掩码,这是sigsetjmp
/siglongjmp
保存的值。
-----编辑----------------------------
来自 sigprocmask
手册(GNU):
The collection of signals that are currently blocked is called the signal mask. Each process has its own signal mask. When you create a new process (see Creating a Process), it inherits its parent’s mask. You can block or unblock signals with total flexibility by modifying the signal mask.
此掩码是通过 siglongjmp
调用恢复的掩码。
来自 sigaction
手册 (GNU) 关于 sa_mask
字段:
This specifies a set of signals to be blocked while the handler runs. Blocking is explained in Blocking for Handler. Note that the signal that was delivered is automatically blocked by default before its handler is started; this is true regardless of the value in sa_mask. If you want that signal not to be blocked within its handler, you must write code in the handler to unblock it.
因此,使用 sigaction
不会修改进程掩码,但会修改它当处理程序将在某个信号传递时执行。
关于c - sigsetjmp() 和 siglongjmp() : The mask signals are not the same on call to sigsetjmp() and return of siglongjmp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975433/
我有两个包含两个接近矩形的形状的蒙版。 面罩示例(黄色): 现在,我要确定其中一个遮罩比另一个遮罩更接近实际矩形。 有可能实现吗? 最佳答案 获取轮廓和(旋转的)矩形边界框之间的面积差。面积差异最小的
我最近从 numpy 1.11 升级到 numpy 1.13 希望摆脱这个屏蔽数组警告,但它仍然存在: MaskedArrayFutureWarning:在具有共享掩码的掩码数组上设置项目不会复制掩码
我需要在sencha中的选项卡面板中添加一个加载掩码,我在 Controller 中通过Ajax请求加载了一个商店,但是在商店加载之前我需要放置一个加载掩码,并且在商店加载之后已加载,我需要将其删除。
我希望能够设置或清除 uintX_t 的(多个)位。 i 是一个运行时变量 (uintX_t)。b 是一个运行时变量 (uintX_t),它被限制为 0 或 1。 mask 是编译时常量。 有没有比以
我有一个处理程序,更像是一个提交按钮。我想掩盖整个页面或该表单以显示等待消息,直到完成其余过程。我做到了,它在FF中有效,但在IE中没有成功,当我执行Ext.getCmp('').body.mask(
我有我使用 Snap SVG 的 JS 代码。在某些时候我使用 element.attr({mask:maskelement}); 在该片段中,element和 maskelement是我的 svg
我需要从图标(.ICO) 文件中获取XOR Mask 和AND Mask。 如果有人可以建议我如何从 Java 执行此操作,那就太棒了。如果没有,您是否知道有任何应用程序可以获取这两个掩码并允许您扔掉
我一直在尝试学习scenekit并完成了一本书,但只有碰撞检测部分不明白,也许是最重要的部分。有类别掩码、共谋掩码和物理体?.contactTestBitMask。 我想创建一个简单的游戏来实现这个目
我在 Canvas 上制作了一个矩形 mask ,我需要 mask 外的任何东西都具有 0.8 的不透明度,因此 mask 外的所有对象都被视为不透明请看一下 fiddle 。 http://jsfi
我有一个包含可滚动内容的 div。我想为其添加一个覆盖内容的颜色 mask ,但不会随内容滚动。 http://jsfiddle.net/6e9t1wt3/1/ *{box-sizing:bord
在我的代码中,我必须选择这两个表达式之一(其中 mask 和 i 是非常数整数 -1 > i & 1) 和 (mask & 1 << i) 哪个更快?,我们在Stack Overflow上找到一个类似
我有一个包含 Image 的 Imageview 。还有一个包含兔子形状的面具形状。我有一个代码可以给出以下结果。 - (UIImage*)mynewmaskImage:(UIImage *)imag
您可能熟悉 enum 位掩码方案,例如: enum Flags { FLAG1 = 0x1, FLAG2 = 0x2, FLAG3 = 0x4, FLAG4 = 0x8
在本文之后,我将尝试实现他们如何计算每个实体的对数概率的平均值(第3.3节)。更具体地说,每个实体的得分计算为其令牌上的日志概率的平均值。。我有一个实体列表和一些提示:。任务是为每个提示找到应该适合的
我正在尝试遮盖比 mask 小的背景图像。背景和蒙版之间的空间显示为黑色。 这是我正在使用的代码: batch.end(); batch.begin(); Gdx
因此,我一直在尝试将背景图像裁剪成圆形 六边形,我发现 webkit 令人惊叹的 mask 图像非常容易地解决了我所有的问题。遗憾的是,它仅适用于 Chrome 和 Safari(当然)。 我如何为非
我有两个Java项目数据服务应用程序和数据报告应用程序,数据服务应用程序生成用于某些处理和数据报告应用程序的某些数据应该使用数据服务应用程序来使用它生成的数据来生成一些报告,这两个应用程序都应该构建为
我有一个带有绿色背景的简单 Activity ,我正在尝试提供一个带有透明圆形区域的红色叠加层。这是我要实现的效果: Expected Image 根据我在网上找到的代码,我看到的是这样的: Resu
我关注了这个link创建一个名为 mask 的自定义操作。tensorflow op的主体是 def tf_mask(x, labels, epoch_, name=None): # add "la
正如标题所说,我有 self.view,我将其添加到它的 mask 中(link) 属性另一个 View ,但是当我使用 addSubview 添加更多 View 到 self.view 时,掩码被删
我是一名优秀的程序员,十分优秀!