Articles of 信号

为什么shell在后台进程中忽略SIGINT和SIGQUIT?

如果我在脚本或-c片段中背景进程,后台进程将忽略SIGINT和SIGQUIT: 例: $ alias ps='ps -o pid,ppid,pgrp,sid,stat,tty,ignored,blocked,caught,wchan,min_flt,pmem,args –forest' $ sh -c 'sleep 1000 & sleep 1000 | sleep 1000' & \ sleep 0.01; ps |grep -v -e ps -e grep PID PPID PGRP SID STAT TT IGNORED BLOCKED CAUGHT WCHAN MINFL %MEM COMMAND 6197 2143 6197 6197 Ss pts/28 0000000000380004 0000000000010000 000000004b817efb wait 10039 0.0 […]

从键盘发送SIGINT到bash中的pipe道命令

如果在bash中运行a | b | c | d a | b | c | d a | b | c | d在命令行上,然后按^ C ,哪个进程得到信号?

如何避免由于Linux中的信号而中断睡眠呼叫

我在Linux中使用实时信号来通知串口中新数据的到达。 不幸的是,当有信号时,会导致睡眠呼叫中断。 有没有人知道一种方法来避免这种行为。 编辑:我试过使用一个常规的信号(SIGUSR1),但我一直得到相同的行为。 谢谢Joao

HUP什么时候停止发送,我该怎么办?

早在我年轻的时候,Unix就是新事物,创build一个在注销时不会被杀的进程是一个挑战。 我们使用nohup命令来保护HUP信号中的持续进程。 如果我们不小心,当我们注销时,我们的进程就会被杀死,甚至closures我们启动它们的shell。 快进到今天,我发现我很惊讶,默认情况恰恰相反。 在Ubuntu和Red Hat系统上,我发现我几乎可以在后台放置任何进程,杀死父shell,注销,任何事情,只是继续下去。 我看到与Bash脚本,Python脚本和C程序相同的行为。 我从xterm或ssh会话中获得相同的行为。 例如,在xterm或ssh窗口中input: while [ 1 ]; do date; sleep 10; done > /tmp/out & 现在从另一个窗口运行 tail -f /tmp/out 看它每10秒打印一次date,然后用Ctrl-Dclosures原来的父shell。 仍在运行。 注销并返回。仍在运行。 发送一个HUP信号,它立即死亡。 我可以展示与Python脚本或C程序相同的行为。 睡或不要紧。 例如,这个丑陋的C程序行为相同: #include <stdio.h> void main() { while(1) { printf("*\n"); fflush(stdout); int i, j, k = 0; for(i=0; i < 10000; i++) { for(j=0; j […]

SDL / C ++ OpenGL程序,如何阻止SDL捕获SIGINT

我正在使用SDL运行在Linux上的OpenGL应用程序。 我的问题是SDL正在捕获SIGINT并忽略它。 这是一个痛苦,因为我正在通过屏幕会话进行开发,而且我不能用CTRL-C(运行计算机的程序连接到投影机而没有input设备)中断正在运行的程序。 有没有一个标志或我可以传递给SDL,以便它不捕获SIGINT? 我真的只是想让程序停止,当它收到信号(即当我按Ctrl-C)。

当一个信号来到时,杀死bash脚本前台儿童

我正在用这样的bash脚本包装一个fastcgi应用程序: #!/bin/bash # stuff ./fastcgi_bin # stuff 由于bash仅在前台脚本结束时执行信号陷阱,所以我不能仅仅kill -TERM scriptpid因为fastcgi应用程序将保持活跃状态​​。 我试过把二进制文件发送到后台: #!/bin/bash # stuff ./fastcgi_bin & PID=$! trap "kill $PID" TERM # stuff 但是,如果我这样做,显然标准input和标准输出没有正确的redirect,因为它不与lighttpds mod_fastgi连接,前台版本确实工作。 编辑:我一直在看问题,这是因为bashredirect/标准错误,当程序在后台启动,所以任何避免这种方式应该也解决了我的问题。 任何提示如何解决这个问题?

在Linux中使用signal.h编译错误

我正在编写一个必须处理信号的shell程序。 我的相关信号处理相关代码如下: #include <signal.h> … #include <sys/types.h> … void installSigactions( int, struct sigaction* ); void handler_function( int signal_id ); … /*define signal table*/ struct sigaction signal_action; /*insert handler function*/ signal_action.sa_handler = handler_function; /*init the flags field*/ signal_action.sa_flags = 0; /*are no masked interrupts*/ sigemptyset( &signal_action.sa_mask ); /*install the signal_actions*/ sigaction( SIGINT, &signal_action, NULL ); 编译给了我以下的警告和错误: […]

我想从COM端口连续接收数据,同时要写入文件

我想读取串行COM端口并将数据写入LINUX中的文件。 其实我是从其他电脑的超级terminal发送数据。 问题是没有while循环,我只能写一行。 但while(1)循环,我不能写任何文件。 否则我必须发送BIG文件,然后应用程序退出/终止并写入文件。 我的应用程序应该写入数据(可能是2行或任何东西); 之后它必须等待下一个数据。 所以请帮我解决….. 这是我的代码 ========================================= #include <termios.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/signal.h> #include <sys/types.h> #include <assert.h> #include <string.h> #include <time.h> #define BAUDRATE B115200 #define MODEMDEVICE "/dev/ttyS0" #define _POSIX_SOURCE 1 /* POSIX compliant source */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; void signal_handler_IO (int status); […]

试图通过陷阱标记和陷阱信号处理程序单步执行程序,在vsyscall上崩溃

我想创build一个完整的程序执行指令跟踪,收集一些统计信息等。我首先尝试使用Linux的ptracefunction来逐步通过一个程序(使用这里的教程)。 这创build了两个进程,跟踪的和debugging器,并通过信号进行通信。 我只有每秒16K的指令(在1.6GHz Atom上),所以对于任何不重要的东西来说这太慢了。 我以为通过信号的进程间通信太慢了,所以我试着在执行过程中设置debugging:设置陷阱标志,并创build一个信号处理程序。 当一个软件中断被用来做一个系统调用时,陷阱标志应该被保存,内核将使用它自己的标志 – 所以我想。 但我的程序不知何故被信号SIGTRAP杀死。 这是我设置的: #include <stdio.h> #include <unistd.h> #include <signal.h> int cycle = 0; void trapHandler(int signum) { if (cycle % 262144 == 0) { write(STDOUT_FILENO," trap\n",6); } cycle += 1; } void startTrace() { // set up signal handler signal(SIGTRAP, trapHandler); // set trap flag asm volatile("pushfl\n" "orl […]

sigtimedwait()在超时之前返回EAGAIN

我试图学习如何使用sigtimedwait(),但是我发现它不是等待超时完成。 下面它似乎比它应该更快地返回EAGAIN 4s(每1分钟超时1秒): #include <signal.h> #include <syslog.h> #include <stdarg.h> #include <stddef.h> #include <errno.h> int main(int argc, char* argv[]) { setlogmask(LOG_UPTO(LOG_NOTICE)); openlog ("SIG_TIMED_WAITER", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); syslog (LOG_NOTICE, "Started"); sigset_t set; sigemptyset(&set); sigaddset(&set, SIGUSR1); struct timespec to; to.tv_sec = 240; to.tv_nsec = 0; int ret = sigtimedwait(&set, NULL, &to); if(ret < 0) { […]