Tag: 信号

如何防止SIGPIPE或阻止服务器结束?

一个非常标准的C ++ TCP服务器程序,使用pthreads , bind , listen和accept 。 我有一个场景,当我杀死连接的客户端时, 服务器结束 (读取:崩溃)。 崩溃的原因是对文件的write()调用失败,因此程序收到SIGPIPE。 我猜,这会让服务器退出。 我想,“当然,未处理的信号意味着退出”,所以让我们使用signal() : signal(SIGPIPE, SIG_IGN); 因为,取自man 2 write : EPIPE fd连接到读取端关闭的管道或sockets。 当发生这种情况时,写入过程也将收到SIGPIPE信号。 (因此,仅当程序捕获,阻止或忽略此信号时才会看到写入返回值。) 唉,没有。 无论是在服务器线程还是客户端线程中,这似乎都没有帮助。 那么, 如何阻止write()调用引发该信号,或者(务实)如何阻止服务器退出。 我的诊断是: 服务器线程启动,绑定,侦听,接受。 让客户端连接(例如通过telnet) 发送一个pkill telnet来崩溃客户端 不需要的行为:服务器退出,在gdb中 … in write () at ../sysdeps/unix/syscall-template.S:82 82 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) 和回溯 : #0 … in write () at ../sysdeps/unix/syscall-template.S:82 […]

Printf无法在C信号处理程序中工作

有问题的代码(最小化案例): #include #include int counter = 0; void react_to_signal(int n) { fprintf(stderr, “Caught!\n”); counter++; } int main(int argc, char** argv) { signal(SIGINFO, react_to_signal); while (1) { printf(“%d\n”, counter); } return 0; } 我运行代码,它应该循环,打印出来0.然后在另一个shell .. kill -s SIGINFO 信号传递, c递增..但fprintf不会发生。 为什么会这样? 处理程序代码在什么环境/上下文中运行? 我在哪里可以读到这个?

如何让tcsetpgrp()在C中工作?

我正在尝试给孩子进程(通过fork() )前台访问终端。 在fork() ,我在子进程中运行以下代码: setpgid(0, 0); 和: setpgid(child, child); 在父进程中。 这为孩子提供了自己的过程组。 对setpgid()的调用正常。 现在我想让孩子访问终端。 在setpgid()调用之后,我向子setpgid()添加了以下内容: if (!tcsetpgrp(STDIN_FILENO, getpid())) { perror(“tcsetpgrp failed”); } 之后,有一个execv()命令来生成/usr/bin/nano 。 然而,没有nano出现,没有任何反应,终端看起来好像它期待用户输入。 此外,在tcsetpgrp()调用之后似乎没有代码执行。 我在某处读到了我需要向子进程发送SIGCONT信号以使其工作。 如果该过程停止,我该怎么办? 父母是否必须发送信号? 如果这是解决方案,我该如何发送SIGCONT信号? raise(SIGCONT); 此外,我不确定这是否有帮助,但代码工作正常,如果我运行我的程序,则生成nano : exec ./program 代替: ./program 有任何想法吗? 非常感谢!

适用于SIGSEGV / SIGABRT和朋友的Oracle Pro * C / OCI安装处理程序 – 为什么以及如何禁用?

当使用Pro * C(Oracle for C-Code的嵌入式SQL预处理器)或OCI时,我注意到connect / init例程安装了一些信号处理程序。 这意味着之前 EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ; 或者a OCIEnvNlsCreate() 我可以validation,例如这些信号有以下处理程序: No NAME Pointer SA_SIGINFO SIG_DFL SIG_IGN ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― 1 SIGHUP (nil) false true false 2 SIGINT (nil) false true false 3 SIGQUIT (nil) false true false 4 SIGILL (nil) false true false 5 SIGTRAP (nil) […]

如何在SIGSEGV上使用_Unwind_Backtrace获取fullstacktrace

我通过代码处理SIGSEGV: int C() { int *i = NULL; *i = 10; // Crash there } int B() { return C(); } int A() { return B(); } int main(void) { struct sigaction handler; memset(&handler,0,sizeof(handler)); handler.sa_sigaction = handler_func; handler.sa_flags = SA_SIGINFO; sigaction(SIGSEGV,&handler,NULL); return(C()); } 处理程序代码是: static int handler_func(int signal, siginfo_t info, void* rserved) { const void* […]

简单信号 – C编程和报警function

#include #include void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf(“Hello”); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } int main(int argc, char *argv[]) { alarm(2); /* set alarm clock */ while (1) ; printf(“All done”); } 我希望程序在2秒后打印“你好”,而输出是“zsh:alarm ./a.out” 知道发生了什么事吗?

处理浮点exception

我不知道如何处理C或C ++中的浮点exception。 从wiki中,有以下类型的浮点exception: IEEE 754 specifies five arithmetic errors that are to be recorded in “sticky bits” (by default; note that trapping and other alternatives are optional and, if provided, non-default). * inexact, set if the rounded (and returned) value is different from the mathematically exact result of the operation. * underflow, set if the […]

fork之后调试子进程(跟随fork-mode子配置)

我正在开发一个应用程序,父母要求孩子处理某些任务。 我遇到了一个问题,我已经将gdb配置为follow-fork-mode子,但是在fork之后,在到达断点之后,它发送了一个SIGTRAP,但是孩子以某种方式终止并将SIGCHLD发送给父服务器。 我已经在fork之前配置了signal(SIGTRAP, SIG_IGN) ,所以我的理解是,当达到断点但是它没有发生时,孩子应该inheritance并忽略SIGTRAP。 如果我不对,请帮助我理解这一点。 如何成功调试子进程?

fflush(stdin)在C编程中做了什么?

我是C编程的新手,我试图了解fflush(stdin)是如何工作的。 在下面的例子中, fflush(stdin)清除所有缓冲区还是清除第三项后输入的内容? 我的意思是用户输入帐号,空格,名称,空格,余额。 这是真的,从这一点开始,无论用户输入什么都将用fflush(stdin)刷新? 和stdin不会是空的。 为什么我这样说是因为它进入while循环并开始写入文本文件。 我的第二个问题是Ctrl-Z是否会告诉操作系统停止要求用户输入输入? printf( “Enter the account name and balance. (separated by spaces)\n” ); printf( “Enter EOF to end input. (Ctrl-Z)\n” ); printf( “? ” ); scanf( “%d%s%lf”, &account, name, &balance ); fflush(stdin); // write account, name and balance into file with fprintf while ( !feof( stdin ) ) { […]

pthreads中的信号处理

我创建了一个pthread,并在其中安装了一个信号处理程序,与main( )函数中的方式相同。 线程的信号处理程序是一个单独的函数。 令人惊讶的是,它不起作用,即线程的信号处理程序无法捕获信号。 这是代码: #include #include #include #include #include typedef struct data { char name[10]; int age; }data; void sig_func(int sig) { printf(“Caught signal: %d\n”,sig); signal(SIGSEGV,sig_func); } void func(data *p) { printf(“This is from thread function\n”); signal(SIGSEGV,sig_func); // Register signal handler inside thread strcpy(p->name,”Mr. Linux”); p->age=30; sleep(2); // Sleep to catch the signal } […]