- python中eof表示什么语句错误
- python中for语句涉及的序列
- python中if是循环语句吗
- python中if语句与或非
C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子:
#include <stdio.h> #include <unistd.h> #include <signal.h> void display(){ printf("http://c.biancheng.net/gdb/"); } int main () { pid_t cpid; pid_t ppid; signal(SIGINT,display); if((cpid=fork())==0){ printf("in cpid\n"); ppid = getppid(); kill(ppid,SIGINT); }else{ wait(NULL); } return 0; }上面程序中存在 2 个进程,分别为 cpid 子进程和 ppid 主进程。cpid 子进程通过 kill() 函数向 ppid 主进程发送了 SIGINT 信号,当主进程接收到此信号时,会由等待状态转而执行 display() 函数。因此程序的执行结果为:
in cpid
http://c.biancheng.net/gdb/
[root@bogon demo]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ ....... <-- 省略部分输出其中,每个信号代表着不同的含义,以 SIGINT 信号为例,它表示程序停止执行,该信号可以通过按
Ctrl+c
组合键发出。换句话说,对于正在执行的程序,通过按
Ctrl+c
键向程序发出 SIGINT 信号,可以使程序停止执行。
info handles
指令,用于查看 GDB 可以处理的信号种类,以及各个信号的具体处理方式。例如:
(gdb) info signals Signal Stop Print Pass to program Description SIGHUP Yes Yes Yes Hangup SIGINT Yes Yes No Interrupt SIGQUIT Yes Yes Yes Quit SIGILL Yes Yes Yes Illegal instruction SIGTRAP Yes Yes No Trace/breakpoint trap SIGABRT Yes Yes Yes Aborted SIGEMT Yes Yes Yes Emulation trap SIGFPE Yes Yes Yes Arithmetic exception SIGKILL Yes Yes Yes Killed ......其中各列的含义分别为:
显然,对于现有的所有信号,GDB 调试器会根据 Stop、Print 以及 Pass 列的值进行相应的处理。当然,GDB 调试器提供了 handle 命令,由此我们就可以通过修改目标信号 Stop、Print、Pass 列的值,调试 GDB 调试器对目标信号的处理方式。有关以上各个信号所表示的具体含义,由于不是本节重点,这里不做详细赘述。感兴趣的读者可以自行查找资料。
(gdb) handle signal mode
其中,signal 参数表示要设定的目标信号,它通常为某个信号的全名(SIGINT)或者简称(去除‘SIG’后的部分,如 INT);如果要指定所有信号,可以用 all 表示。注意,当 GDB 捕获到信号并暂停程序执行的那一刻,程序是捕获不到信号的,只有等到程序继续执行时,信号才能被程序捕获。
#include <stdio.h> #include <signal.h> void display(){ printf("http://c.biancheng.net/gdb/\n"); } int main () { signal(SIGINT,display); while(1){ sleep(1); printf("main\n"); } return 0; }
前面已经讲过,SIGINT 信号是可以通过该程序存储在 ~/demo/main.c 文件中,并已编译为可供 GDB 调试的 main.exe 可执行程序。
Ctrl+c
组合键发出的,因此上面程序执行时,除非我们手动发出 SIGINT 信号,程序会马上执行 display() 函数,否则一直输出 "main" 字符串。
(gdb) info signals SIGINT
Signal Stop Print Pass to program Description
SIGINT Yes Yes No Interrupt
(gdb) r
Starting program: ~/demo/main.exe
main
main
^C
Program received signal SIGINT, Interrupt.
0x00000037ee2accc0 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)
info signals SIGINT
命令,我们调取出了当前 GDB 调试器对 SIGINT 信号处理方式的默认设定,即当 SIGINT 信号发生时,GDB 调试器会暂停程序执行,同时打印出必要的提示信息,并且不让程序捕获到该信号。由此,当程序执行过程中按下
Ctrl+c
组合键后,并没有执行 display() 函数,而是立即暂停了程序。
(gdb) handle SIGINT nostop
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) y
Signal Stop Print Pass to program Description
SIGINT No Yes No Interrupt
(gdb) handle SIGINT pass
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) y
Signal Stop Print Pass to program Description
SIGINT No Yes Yes Interrupt
(gdb) continue
Continuing.
main
main
main
^C
Program received signal SIGINT, Interrupt.
http://c.biancheng.net/gdb/
main
^Z
Program received signal SIGTSTP, Stopped (user).
0x00000037ee2accc0 in __nanosleep_nocancel () from /lib64/libc.so.6
(gdb)
Ctrl+c
组合键时,看到打印出了 "http://c.baincheng.net/gdb/" 数据。
我只是在 Mac OS X 中玩信号。 为什么在我的信号处理程序完成后,以下代码不会产生 SIGSEGV 的默认行为?在 Linux 下,代码运行良好。 #include #include #in
信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。 有些信号不能被程序捕获,但是下表所
C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子: #include <stdio.h> #include <unistd.h> #include <
是否有关于重叠处理的任何好的(如果可能的话)科学资源(网络或书籍)。我对分析信号时使用重叠处理和窗口的效果不感兴趣,因为要求是不同的。有关以下实时情况的更多信息:(我当前正在处理音频信号) 将信号分成
在下面的代码中: #include #include #include #include #include using namespace std; void signal_callback_
我是操作系统的新手,在学习 Linux 信号处理时遇到了一些问题。 在 Linux 中,如果信号在系统调用期间到达,例如 pause(),程序将切换到内核模式并运行信号处理程序。然后根据处理函数,程序
我正在尝试在 shell 中实现一个简单的两级管道。 当我不做第二个 fork 而只是在父级中执行管道的其余实现时,它工作正常但我退出了 shell。这就是为什么我想做第二个 fork,这样我就不会退
我写了一个小脚本,用 Python 做了一些非常耗时的事情,我包含了一个信号处理模块,用于监听 SIGINT、SIGQUIT 和 SIGINFO,当用户输入 SIGQUIT 或 SIGINFO 时打印
我有一个正在读取的传感器,目前代码是用 Java 编写的,但我认为问题不是特定于语言的,更多的是与方法相关。 传感器会产生具有高脉冲和低脉冲的信号,大致类似于心跳。然而,“高”脉冲并不总是相同的电平,
使用mpirun时,是否可以在运行的代码中捕获信号(例如,^C生成的SIGINT)? 例如,我正在运行并行化的 Python 代码。在单独运行 python blah.py 时,我可以 except
如果 linux 进程正在等待 I/O(即它处于 SLEEP 状态)并且针对它发出 SIGKILL 信号,则在终止时( STOPPED 状态)是否会通过RUNNING 或READY 状态? 换句话说,
当进程正在执行阻塞系统调用时,比如读或写,信号已经到达。系统调用是否因错误 EINTR 而终止?处理系统调用后是否重启系统调用? 假设系统调用因错误 EINTR 终止,内核在返回用户空间之前处理该信号
有人可以解释为什么我们不应该从信号处理程序调用非异步函数吗?就像调用此类函数时破坏程序的确切步骤顺序一样。而且,信号是否总是在单独的堆栈上运行?如果是这样,它是一个单独的上下文还是在信号线程的上下文中
我在处理多线程服务器中的信号处理时遇到了麻烦。我为每个连接创建一个线程,但我希望有一个选项可以使用 SIGINT 终止服务器。但是,当其中一个线程捕获到信号时,事情会变得很糟糕。除了主线程之外,有什么
我写了一个扭曲的程序来处理来自 TCP 套接字和原始套接字的请求。由于 twisted 不支持原始线程,我在名为“raw_socket_loop”的函数中编写了原始套接字选择轮询循环。主 react
这个问题在这里已经有了答案: c: catch a segfault in exec() which was run in a child process (1 个回答) 关闭 6 年前。 我有一个
我有一个 repeat python 函数和一个只有一个按钮的 test.ui。我的疑问是每次单击按钮时如何准确地循环一次相同的功能。因为对我来说,每当我表演时: self.pushButton.cl
我想禁用像 SIGINT 这样的信号,它是通过按 CTRL_C 发送的,还有其他将终止 JVM 的信号。我在此处阅读了有关-Xrs 选项的信息 http://docs.oracle.com/javas
这个问题在这里已经有了答案: Getting fault address that generated a UNIX signal (2 个答案) 关闭 5 年前。 有没有办法找出被某些信号中断的机
是否可以通过 Erlang 中的处理程序捕获 Linux 信号(例如 SIGUSR1)? (无需求助于用 C 编写的驱动程序) 最佳答案 (不是真正的答案) 2001 年有人问: Does anyon
我是一名优秀的程序员,十分优秀!