Tag: 信号

信号处理程序和waitpid共存

我在C中编写一个应该支持后台和前台进程的shell。 约束: 终止的后台进程应该由信号处理程序捕获 没有全局变量可用于从信号处理程序进行通信 没有允许的进程/ pid列表 我的解决方案 Waitpid直到前台进程终止 对于后台进程,立即返回提示 Handler捕获SIGCHLD,其中waitpid用于清除进程表 问题: 前台进程还会触发处理程序,导致两个waitpids中的一个出错 在运行前台进程时无法通过忽略SIGCHLD来解决,因为后台进程可能在此期间终止 找不到让处理程序忽略特定pid的方法(前台进程已启动) 谢谢!

从SIMD指令捕获SIGFPE

我试图清除浮点除以零标志以忽略该exception。 我期待着设置了标志(我相信默认行为没有变化,并在下面注释掉),我的error handling程序将触发。 但是, _mm_div_ss似乎没有提高SIGFPE。 有任何想法吗? #include #include #include #include static void sigaction_sfpe(int signal, siginfo_t *si, void *arg) { printf(“inside SIGFPE handler\nexit now.”); exit(1); } int main() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); sa.sa_sigaction = sigaction_sfpe; sa.sa_flags = SA_SIGINFO; sigaction(SIGFPE, &sa, NULL); //_mm_setcsr(0x00001D80); // catch all FPE except divide by zero __m128 s1, […]

非阻塞套接字在C中没有自旋锁接受

可能重复: 唤醒线程在accept()调用时被阻塞 我正在编写一个小型服务器,它监听连接(接受它们并将它们传递给工作线程),直到发送自定义停止信号。 如果我使用阻塞套接字,那么我的主接受循环不会破坏正在发送的自定义停止信号。 但是,我希望避免使用带有非阻塞套接字的busy-wait / spinlock循环。 我想要的是我的主接受循环阻止,直到收到连接或发送停止信号。 这可能在Linux上的C? 非常感谢。

GDK信号,按键和按键掩码

我试图抓住用户键在GUI窗口上按Ctrl + d退出。 我的代码如下所示: static gboolean callback(GtkWidget *widget, GdkEventKey *event, gpointer data) { if(event->state == GDK_CONTROL_MASK && event->keyval == ‘d’) gtk_main_quit(); return FASLE; } 这适用于我的笔记本电脑(Ubuntu 11.04,gcc 4.5.2,libgtk 2.24.4)。 但是当我在一个较新的系统(Ubuntu 12.10,gcc 4.7.2,libgtk 2.24.13)上做同样的事情时,它不起作用。 我添加了g_print(“%u\n”, event->state); 在if语句之前,它显示当我按下Ctrl ,文档中的event->state为20而不是4或1 << 2。 如果我将GDK_CONTROL_MASK更改为20,它适用于较新的系统,但不适用于较旧的系统。 有人请告诉我为什么会发生这种情况以及如何解决这个问题。

POSIX定时器:定时器的信号处理程序冻结

这篇文章与以下内容有关: POSIX TIMER-有多个计时器 我想在SignalHandler中调用一个函数。 此函数是TCP套接字客户端(getSpeed)。 每次计时器滴答一秒钟时它从服务器获取数据并发送一个信号,然后调用相应的处理程序。 首先,我不确定从信号处理程序调用函数是否是一个好习惯。 现在问题是,每当我执行与服务器通信的程序时,我的代码就会随机冻结。 如果这种使用信号定义计时器的方式很糟糕(并且可能导致一些隐藏的竞争条件)是否有更好的方法来编码上述场景? #include #include #include #include #include #include #include #include static timer_t tid; static timer_t tid2; void SignalHandler(int, siginfo_t*, void* ); timer_t SetTimer(int, int, int); int getSpeed(void) { int sockFD = 0; struct sockaddr_in addr; int numbytes; unsigned char rxMsg[128]; /* open socket */ if((sockFD = socket(AF_INET, SOCK_STREAM, […]

信号执行期间的sigprocmask

我正在研究使用sigprocmask来阻止某些关键代码段执行时的某些信号(在本例中为SIGALRM和SIGCHLD )。 与这些信号相关联的两个信号处理程序都将访问和修改中央数据结构,因此在主进程处理它时阻止它们访问它是至关重要的。 目前,我的计划是在代码的关键部分开始时简单地禁用这些信号,然后在最后重新启用它们。 void criticalFunction(void) { // disable signals with sigprocmask // critical code // enable signals with sigprocmask } 但是,要阻塞的信号的信号处理程序也会调用criticalFunction 。 当他们调用sigprocmask函数并对自己的信号启用阻塞时会发生什么? 他们会停止还是继续执行? (或者某些第三个条件..) 我能找到的唯一一个注意事项如下: 如果在信号处理程序中调用sigprocmask(),则从处理程序返回可以通过恢复原始挂起信号掩码来撤消sigprocmask()的工作。 ( http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp ) (这是我上一个问题的后续问题: 信号处理程序访问队列数据结构(竞争条件?) )

msgrcv – SA_RESTART标志不起作用

我的代码使用IPC队列在线程之间进行通信有问题。 我需要安全地处理SIGINT – 让程序在关闭之前出现SIGINT时完成所有活动线程。 虽然,我有找到解决方案的严重问题,因为即使对带有标志SA_RESTART的SIGINT进行sigaction,msgrcv函数也会出现EINTR错误。 我的问题是 – 有没有办法避免使用msgrcv函数的EINTR,而不是在某些“if”中指定错误条件,例如: if (msgrcv<0){ if (errno == EINTR){ errno = 0; } } 这是我的程序的简化版本,用于演示问题: #include #include #include #include #define IPC_KEY 11000 #define BUF_SIZE 128 //structure of IPC message typedef struct msgbuf{ long mtype; char mtext[BUF_SIZE]; } message_buf; void handle_sigint(int sig){ signal(SIGINT,SIG_IGN); /* some operation to handle sigint, here it’s […]

信号的返回值

我正在阅读有关信号function,定义是: void (*signal(int sig, void (*func)(int)))(int); 并且返回值是: If the request can be honored, signal() shall return the value of func for the most recent call to signal() for the specified signal sig. Otherwise, SIG_ERR shall be returned and a positive value shall be stored in errno. 怀疑是:是不是信号无效function? 它应该什么都不返回?

在哪里为SIGPIPE声明sig_t信号

我目前正在使用kqueue来处理Serverprocess中每个线程的多个客户端,因此我不希望在Signal SIGPIPE出现时终止该线程,我只想从kqueue中删除相应的socked id。 所以我的问题是:有没有办法在Signalhandle中获取相应的socketid并将其解析回Process以从事件kqueue中删除它,或者我将jsut转换为SIGPIPE的SIG_IGN并通过返回-1来处理删除发送? 并且它会在超时时间后返回-1值还是立即返回-1? 最后,如果信号忽略是我的解决方案:其中id必须放置声明 typedef void (*sig_t) (int); sig_t signal(int sig, sig_t func); 它必须在主要function? 还是在相应线程的开头? 还是作为全球元素?

即使使用SA_RESTART,哪些function也会被信号中断?

当接收或处理信号时,是否有任何合理完整的POSIX中哪些函数被EINTR中断的列表,即使没有信号处理程序或者处理程序是否安装了SA_RESTART ? 一些例子: select nanosleep 等等