Tag: 信号

Unix pthreads和信号:每个线程信号处理程序

我无法让线程捕获正确的信号。 例如, 我首先开始一个主线程(tid 1)。 然后,它使用signal(2) SIGUSR1的信号处理程序设置为function1( signal(2) 。 主线程使用tid 2创建一个新线程。 在线程2中,我使用signal(2) SIGUSR1的信号处理程序注册到function2() signal(2) 。 线程1然后创建线程3(tid 3)。 从线程3,我使用pthread_kill(1, SIGUSR1)向线程1发送信号。 但是, function2()被调用,而不是function1() 。 这种行为是否有意,或者是否需要更改以使这些信号处理程序工作? 编辑:我已经完成了一些调试,结果是信号IS被发送到线程1,但是function2()由于某种原因从线程1调用。 这有解决方法吗?

在封闭连接上写入不会立即生成sigpipe

我在C上的服务器/客户端遇到了这个问题。如果我在SIGINT之后关闭服务器套接字,然后我尝试从客户端写这个关闭的连接,我要写两次,而不是客户端生成SIGPIPE 。 它不应该立即产生吗? 这是正常行为还是我需要解决的问题? 这是我的代码。 我正在ubuntu上测试一些东西,同样的PC,通过127.0.0.1连接。 server.c sigset_t set; struct sigaction sign; int sock_acc; int sock; void closeSig(){ close(sock_acc); close(sock); exit(1); } int main(){ sigemptyset(&set); sigaddset(&set, SIGINT); sig.sa_sigaction = &closeSig; sig.sa_flags = SA_SIGINFO; sig.sa_mask = set; sigaction(SIGINT, &sig, NULL); //other code to accept the connection from the client sigprocmask(SIG_UNBLOCK, &set, NULL); //write/read calls } client.c […]

std :: signal和std :: raise线程安全吗?

C和C ++标准支持信号的概念。 但是,C11标准表示无法在multithreading环境中调用函数signal(),或者行为未定义。 但我认为信号机制本质上适用于multithreading环境。 引用C11标准7.14.1.1.7 “在multithreading程序中使用此函数会导致未定义的行为。实现的行为就像没有库函数调用信号函数一样。” 对此有何解释? 以下代码不言而喻。 #include #include using namespace std; void SignalHandler(int) { // Which thread context here? } void f() { // // Running in another thread context. // raise(SIGINT); // Is this call safe? } int main() { // // Register the signal handler in main thread context. // signal(SIGINT, […]

sig_atomic_t实际上如何工作?

编译器或操作系统如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是primefaces的? 使用两者的程序具有相同的汇编代码。 如何特别注意使操作成为primefaces?

处理完信号后,C程序能否继续执行?

我是Unix中通过C进行信号处理的新手,我一直在寻找一些关于它的教程(出于纯粹的兴趣)。 我的问题是,是否有可能在处理信号之后继续执行程序? 我知道信号处理function会进行清理,但本着exception处理的精神(例如在C ++中),是否可以以相同的方式处理该信号并使程序继续正常运行? 目前catch进入无限循环(可能是退出的方式是调用exit(1) )。 我的意图是为b分配1并使程序优雅地完成(如果可能的话)。 这是我的代码: #include #include int a = 5; int b = 0; void catch(int sig) { printf(“Caught the signal, will handle it now\n”); b = 1; } int main(void) { signal(SIGFPE, catch); int c = a / b; return 0; } 另外,由于C是程序性的,为什么在执行后者之后实际调用有问题的语句之前声明的信号处理程序呢? 最后,为了使处理函数正确地进行清理,所有在exception情况下需要清理的变量都需要在函数之前声明,对吧? 如果以上一些非常明显,请提前感谢您的回答和道歉。

分段违规后恢复生机

在Segmentation Fault错误之后,是否可以恢复C程序的正常执行流程? struct A { int x; }; A* a = 0; a->x = 123; // this is where segmentation violation occurs // after handling the error I want to get back here: printf(“normal execution”); // the rest of my source code…. 我想要一个类似于NullPointerException的机制,它存在于Java,C#等中。 注意 :请不要告诉我C ++中有一个exception处理机制,因为我知道,不要告诉我在分配之前应该检查每个指针等。 我真正想要实现的是恢复正常的执行流程,如上例所示。 我知道可以使用POSIX信号进行一些操作。 应该怎么样? 其他想法?

处理multithreading程序中的异步信号

Linux Programming Interface提到了一种在multithreading程序中处理异步信号的方法: 所有线程都阻止进程可能接收的所有异步信号。 最简单的方法是在创建任何其他线程之前阻止主线程中的信号。 随后创建的每个线程都将inheritance主线程信号掩码的副本。 使用sigwaitinfo() , sigtimedwait()或sigwait()创建一个接受传入信号的专用线程。 这种方法的优点是同步接收异步生成的信号。 由于它接受传入信号,专用线程可以安全地修改共享变量(在互斥控制下)并调用非异步安全function。 它还可以发信号通知条件变量,并且可以实现其他线程和进程通信和同步机制。 现在的问题是: 当内核想要传递信号时,它会选择任意一个进程内的线程。 从哪里可以知道将信号传递给专用线程? pthread API是非同步安全的函数。 那么我们如何在信号处理程序中使用它们?

在multithreading程序中捕获SIGINT

我正在编写一个multithreading程序,我想从用户处理一个可能的Ctrl-C命令来终止执行。 据我所知,无法保证能够取消每个工作线程的主线程将捕获信号。 因此,是否有必要对工作线程的代码使用不同的信号处理程序,以便任何人在信号到达时捕获信号,或者是否有另一种方法通过仅在主线程的代码中使用信号处理程序来执行此操作?

unix信号如何工作?

信号如何在unix中工作? 我经历了WR史蒂文斯,但无法理解。 请帮我。

C中的信号处理 – 中断中断

当我的程序同时处理其他信号时,我想知道是否有可能被信号中断,我试图用以下方法模拟它: #include #include #include #include #include #include void sig_output() { sigset_t set; sigprocmask(0,NULL,&set); printf(“currently blocking:”); if (sigismember(&set,SIGUSR1)) printf(“\nSIGUSR1”); if(sigismember(&set,SIGUSR2)) printf(“\nSIGUSR2”); printf(“\n”); return ; } void sig_handler(int sig) { raise(SIGUSR1); printf(“start\n”); if (sig==SIGUSR1) printf(“SIGUSR1\n”); else if (sig==SIGUSR2) printf(“SIGUSR2\n”); printf(“end\n”); return ; } void other_sig_handler(int sig) { printf(“start – other\n”); if (sig==SIGUSR1) printf(“SIGUSR1\n”); else if (sig==SIGUSR2) printf(“SIGUSR2\n”); […]