Articles of 信号处理

如何解决在Linux 32位机上的REG_EIP未声明(首次在此函数中使用)错误?

我在用C语言编写的用gcc编写的信号处理器程序时遇到了错误,在发生分段错误后显示转储的寄存器值。 当我尝试使用代码访问它时: void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false) { const char *flags_str[] = { "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF", "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID" }; greg_t *regs = ctx->uc_mcontext.gregs; void *eip[1] = { (void*)regs[REG_EIP] }; char **symbol = backtrace_symbols(eip, 1); […]

在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 ); 编译给了我以下的警告和错误: […]

我可以在Linux进程的地址空间中写保护每一页吗?

我想知道是否有办法在Linux进程的地址空间(从进程内部通过mprotect() )保护每一页。 通过“每一页”,我真的指的是进程的地址空间的每一页,可以通过用户模式运行的普通程序来写 – 即程序文本,常量,全局variables和堆 – 但是我对于常量,全局variables和堆将会很满意。 我不想写保护堆栈 – 这似乎是一个坏主意。 一个问题是,我不知道从哪里开始写保护内存。 看看/proc/pid/maps ,它显示了给定pid使用的内存段,它们似乎始于地址0x08048000和程序文本。 (在Linux中,据我所知,一个进程的内存是用底部的程序文本进行布局的,然后是常量,然后是全局variables,然后是堆,然后是根据大小变化的空的空间堆栈或堆栈,然后从虚拟地址0xffffffff的内存顶部向下生长的堆栈)。有一种方法可以告诉堆栈的顶部是哪里(通过调用sbrk(0) ,它只是返回一个指向目前的“rest”,即堆的顶部),但不是一个真正的方法来告诉堆开始的地方。 如果我试图保护从0x08048000到中断的所有页面,我最终得到一个mprotect: Cannot allocate memory错误。 我不知道mprotect为什么会分配内存 – 而Google并不是很有帮助。 有任何想法吗? 顺便说一下,我想这样做的原因是因为我想创build一个在程序运行过程中写入的所有页面的列表,我可以想到的方式是写保护所有页面,让任何尝试写入导致写入错误,然后实现一个写入error handling程序,将页面添加到列表,然后删除写保护。 我想我知道如何执行处理程序,只要我能弄清楚哪些页面要保护以及如何去做。 谢谢!

将所有访问陷阱地址范围(Linux)

背景 我正在编写一个框架,以便能够在模拟器和未修改的主机软件中运行RTL的协同仿真。 主机软件是为了控制实际硬件而编写的,通常以两种方式之一工作: 通过驱动程序读/写电话 内存映射访问使用mmap 前一种情况非常简单 – 编写一个实现与驱动程序相同的读/写调用的库,并在运行模拟时进行链接。 这一切都很好,我可以运行未经修改的生产软件作为我的RTL模拟的刺激。 第二种情况比第一种情况要困难得多 陷印mmap 最初我以为我可以使用LD_PRELOAD拦截mmap调用。 在我的mmap实现中,我会分配一些页面alignment的内存,然后mprotect ,并设置一个信号处理程序来捕获SIGSEGV 。 这种方法有许多问题: 读与写 我可以从siginfo_t->si_addr确定访问的地址,而不是访问是读还是写。 捕捉重复访问 在信号处理程序中,我需要取消保护内存区域,否则只要我的处理程序退出并且主机代码无法继续,我就会重复SIGSEGV 。 但是,如果我取消保护区域,那么我的信号处理程序将不会捕获后续访问。 信号处理器的混乱 在模拟器驱动RTL时阻塞信号处理程序,并返回结果违反各种编程规则 – 特别是考虑到模拟器可能会触发各种其他事件并执行任意代码,然后返回此访问的结果。 其他方法 我想知道是否可以创build类似于磁盘的文件类对象,而不是在缓冲区上使用mprotect 。 我还没有发现任何信息表明这是可行的。 问题 是否有可能捕获所有访问到一个mmap区域,以及如何? 访问需要阻塞一段不确定的时间(模拟器运行时) 读取访问需要检索我的陷阱放置的新值 假设LD_PRELOAD和mprotect是最好的路线: 我可以确定访问是读取还是写入? 我要怎样捕捉后续的访问,因为我必须mprotect该地区的保护? 相关问题 如何编写一个信号处理程序来捕获SIGSEGV? 可能陷入写地址(x86 – linux)

如何在八度中播放声音?

八度似乎假设一个特定的声音播放工具将在系统上可用,但似乎没有提供指定替代的能力。 在下面的错误中,Octave正在寻找ofsndplay ,这不是在所有系统上可用的实用程序。 八度:38>声音(beamformed_20) sh:ofsndplay:找不到命令 有没有一个八度configuration设置或代码片段,我可以用来指定一个系统相应的工具?

在C中获取键盘中断

程序: #include<stdio.h> void main() { int time=1800; while(1){ system("clear"); time-=1; printf("%d\n",time); sleep(1); if(time==0) pause(); } } 上面的程序在时间到达0时停止。我的要求是在程序运行期间,如果我按下空格键或任何其他键的任何一个键,程序会暂停,再一次按下键,程序会恢复。 为此,在执行while条件之前,我们提交键盘中断的信号处理程序。 在C如何做到这一点。 什么是用来获得键盘中断的function。 我不想从用户获得input,我想通过键盘来处理用户产生的中断。 提前致谢..,

什么构成asynchronous安全

据说你应该只在一个信号处理程序中调用asynchronous安全的函数。 我的问题是,什么构成asynchronous安全 ? 一个可重入和线程安全的函数是asynchronous安全的,我猜? 或没有?

Python – 捕获所有信号

在Linux下的Python 2.6中,我可以使用以下来处理一个TERM信号: import signal def handleSigTERM(): shutdown() signal.signal(signal.SIGTERM, handleSigTERM) 有什么办法可以为进程接收的所有信号设置一个处理程序,除了一次性设置它们?

在Windows上使用C将数据stream式传输到声卡

作为大学项目的一部分,我必须做一些信号处理,并希望使用PC声卡输出结果。 该软件必须用C编写,需要与Windows(最好是7和XP)一起工作。 我发现输出.wav和类似文件的代码示例,但我有兴趣连续输出数据,而不是从文件输出。 尽pipe一些声音API似乎有自己的处理缓冲区的方法,但输出的数据很可能会以数组的forms呈现。 任何build议都会很好,代码示例甚至是最好的API。 我已经看过DirectSound和OpenAL,但是我还不确定如何开始。

将void *内容复制到SigLib中struct SLData_t *

我正在做一个使用C ++的Windows应用程序。 我有下一个哥们。 我有这个function,我收到数据audio捕获void * void Pre_proc_mono::PreProcess(void *data, int lenbytes) { SLData_t *signal1; SLData_t *signal2; SLData_t *result; signal1 = (SLData_t*)data; signal2 = new SLData_t[lenbytes]; result = new SLData_t[2 * lenbytes – 1]; for (int i = 0; i < lenbytes; i++){ signal2[i] = signal1[i]; } } 循环总是在11000左右失败,为什么? 我究竟做错了什么 ? 这个想法然后与SigLib库(DSP库)做一个关联交叉。 所以我需要有限制的数组,而不是指针,所以我正在做这个。 帮帮我? 编辑:首先,当我说失败我想说当循环达到11000左右出现和运行时错误。 第二个SLData_t是SigLib库的一种date,做相关交叉的函数需要这个variables作为input。