Tag: 信号

为什么WIFSIGNALED(状态)在使用ptrace跟踪进程时无法检测到信号?

我正在使用ptrace来跟踪子进程。 当子进程正常退出时,它可以很好地工作。 但是如果它exception退出,程序就会进入无限循环,尽管使用宏WIFSIGNALED(&status)。 这是示例子进程: try.c int main() { int a=5/0; } 这是追踪计划 #include #include #include #include #include #include /* For SYS_write etc */ #include #include int main() { pid_t child; long orig_eax, eax; int status,insyscall = 0; child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME, 0, NULL, NULL); execl(“./try”, “try”, NULL); } else { siginfo_t […]

使用gnome多媒体键无法让dbus信号监听器在C中工作

我正在尝试创建自己的应用程序,它将使用dbus监听gnome中的媒体键。 我找到了一个在python中运行的脚本,我试图通过将其转换为C来使其工作。我的c代码构建并正确运行但它不响应dbus信号。 这个python代码有效: #!/usr/bin/env python “””Printing out gnome multi media keys via dbus-python. “”” import gobject import dbus import dbus.service import dbus.mainloop.glib def on_mediakey(comes_from, what): “”” gets called when multimedia keys are pressed down. “”” print (‘comes from:%s what:%s’) % (comes_from, what) if what in [‘Stop’,’Play’,’Next’,’Previous’]: print (‘Got a multimedia key!’) else: print (‘Got a […]

为什么即使设置了SA_NODEFER标志,sigaction处理程序也不处理每个信号?

我有一个父进程,它生成十个子进程,并使用SIGCHILD处理程序通知子进程何时死亡。 子进程将在它们启动时通知,然后立即退出。 我使用SA_NODEFER标志来防止SIGCHLD信号在太多进入时被丢弃。孩子们都被正确终止并收到了,但是在这个脚本中以及同时通过控制台信号终止两个信号同时发送时间总是显得一体。 #define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include void CHLDHandler(int sig) { char child[] = “Child finished!\n”; write(1, &child, sizeof(child)); } int main(int argc, char const *argv[]) { struct sigaction sa; sa.sa_handler = CHLDHandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_NODEFER; sigaction(SIGCHLD,&sa,NULL); for (size_t i = 0; i < 10; i++) { int pid […]

如何阻止C中的信号?

我正在尝试创建一个阻止信号SIGUSR1的程序,它会解锁信号。 在中间,我想看到使用sigpending阻止信号。 但它总是说信号没有被阻挡,我可以在信号被阻挡时使用它。 这是我的代码。 #include #include #include static void signals(int signaln) { switch (signaln) { case SIGUSR1: printf(“Signal SIGUSR1\n”); break; } return; } main() { sigset_t set,set2; struct sigaction sigs; sigs.sa_handler = signals; sigemptyset(&sigs.sa_mask); sigs.sa_flags=SA_ONESHOT; sigaction(SIGUSR1, &sigs,0); sigemptyset(&set); sigemptyset(&set2); sigaddset(&set,SIGUSR1); if(sigprocmask(SIG_BLOCK, &set, NULL)==0){ printf(“Blocking SISGUSR1…\n”); } sigpending(&set2); if (sigismember(&set2,SIGUSR1)==1) { printf(“The signal is blocked\n”); //it […]

忽略父进程中的信号

我正在尝试实现一个shell程序,我希望shell程序忽略SIG_INT(ctrl + c)。 但是在我的程序中,孩子也忽略了SIG_INT信号,因为exec应该将子进程带到另一个程序,并且该程序应该默认处理SIG_INT信号。 我应该怎么做才能在按下ctrl + c时终止子进程。 新编辑:在我的子进程块中放置信号(Certain_signal,SIG_DFL)后,我的代码工作正常。 但我仍然对这项工作的方式感到困惑。 这是否意味着信号和信号处理都可以通过执行命令传播? int main(void){ signal(SIG_INT, SIG_IGN); int result = fork(); if(result == 0){ //child: //exec some programs } else{ waitpid(result); //do something } }

用信号中断c / c ++ readline

我试图用信号(SIGUSR1)中断readline,但显然如果没有处理信号,程序退出,处理时,readline继续进行,好像什么也没发生。 读取线应该能够使用信号中断。 我从另一个问题中得到了一个想法: 强制退出readline()函数 #include #include #include #include #include pthread_t main_id; void *thread_main(void* arg) { sleep(10); pthread_kill(main_id, SIGUSR1); } void signal_handler(int sig) { puts(“got signal”); (void) sig; } int main(int argc, char** argv) { struct sigaction sa; sa.sa_handler = signal_handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); main_id = pthread_self(); pthread_t id; pthread_create(&id, NULL, thread_main, […]

Android和JNI实时时钟

我遇到了迷你Android应用程序的问题以及在C(JNI)函数中使用实时时钟信号。 看起来Android UI不喜欢来自C函数中实例化的定时器的实时信号。 在下面的PoC ,定时器每秒触发信号5次,如果在UI更新时触发信号,则应用程序崩溃。 如果我没有启动计时器=>没有崩溃 如果我没有在UI上放任何东西=>没有崩溃 我写了这个小PoC来certificate这种行为。 Java部分只是调用JNI函数并在屏幕上放置一个按钮。 public class MainActivity extends AppCompatActivity { Button bt; static { System.loadLibrary(“testtimer-jni”); } /* JNI ingresso */ public native void jniStartTimer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); jniStartTimer(); /* load button */ bt = new Button(getBaseContext()); setContentView(bt); } } 这是main.c文件的内容。 实例化并启动计时器。 每200ms (每秒5次cb()调用cb()函数。 #include #include #include […]

信号处理程序不会看到全局变量

这是问题:这个程序应该从stdin接收输入并计算插入的字节数; SIGUSR1信号将停止主程序并将在文件标准错误上打印当我发送SIGUSR1时已经复制了多少字节。 这就是我老师要我这样做的方式:在一种终端类型中 cat /dev/zero | ./cpinout | cat >/dev/null 而从第二个终端发送信号 kill -USR1 xxxx 其中xxxx是cpinout的pid。 我更新了我以前的代码: /* cpinout.c */ #include #include #include #include #include #define BUF_SIZE 1024 volatile sig_atomic_t countbyte = 0; volatile sig_atomic_t sigcount = 0; /* my_handler: gestore di signal */ static void sighandler(int signum) { if(sigcount != 0) fprintf(stderr, “Interrupted after %d […]

可以在Linux上的用户空间中实现本机代码的抢占式多任务处理吗?

我想知道是否有可能在Linux上的用户空间中的单个进程内实现本机代码的抢占式多任务处理。 (也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用。)我以为这可以使用信号来完成SIGALRM处理程序和*context()系列但事实certificate整个*context()系列是异步信号不安全的,因此无法保证方法有效。 我确实找到了实现这个想法的要点 ,所以显然它确实在Linux上运行,至少有时候,即使POSIX也不需要工作。 gist将其安装为SIGALRM上的信号处理程序,它会进行多次*context()调用: void timer_interrupt(int j, siginfo_t *si, void *old_context) { /* Create new scheduler context */ getcontext(&signal_context); signal_context.uc_stack.ss_sp = signal_stack; signal_context.uc_stack.ss_size = STACKSIZE; signal_context.uc_stack.ss_flags = 0; sigemptyset(&signal_context.uc_sigmask); makecontext(&signal_context, scheduler, 1); /* save running thread, jump to scheduler */ swapcontext(cur_context,&signal_context); } Linux是否提供任何使此方法正确的保证? 有没有办法让这个正确? 是否有完全不同的方法正确地做到这一点? (通过“在用户空间中实现”我并不是说我们永远不会进入内核。我的意思是与内核实现的抢先式多任务进行对比。)

在C中设置以毫秒为单位的警报

我目前有一些C代码使用sigaction将处理程序与SIGALRM信号关联起来。 然后我做闹钟(TIME_OUT_IN_SECONDS)。 问题是,我需要毫秒,而不是秒,报警需要一个整数。 如何设置信号在几毫秒内触发?