Tag: 信号

子进程可以在没有父进程死亡的情况下吗?

杀 – 它会立即杀死这个过程吗? 我找到了答案,并为SIGCHLD设置了一个信号处理程序,并在该处理程序中引入了wait 。 这样,每当父进程终止子进程时,就会调用此处理程序并调用wait来获取子进程。 – 动机是清除进程表条目。 即使没有父进程死亡,我仍然会看到一些子进程持续几秒钟。 – 这怎么可能? 我通过ps看到这个。 准确地说ps -o user,pid,ppid,command -ax和greping for parent进程,子进程和defunct。

c – 将多个参数传递给GTK中的回调函数

所以,我正在努力实现以下目标:用户应该能够填写多个gtk_entry并在此之后单击Apply ,在单击时我希望Apply按钮发出信号,如下所示: g_signal_connect(G_OBJECT(Apply),“clicked”,G_CALLBACK(apply_clicked),#a argument#); 之后,在apply_clicked() ,我希望保存输入的文本。 我的问题是:如何将那些gtk_entry传递给我的回调函数apply_clicked ? 如果它只是一个我只是将其设置为# an argument # ,但我应该怎么做多个条目?

创建并发出gtk信号

我正在尝试创建并发出GTK信号: g_signal_new(“child-finished”, G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, // *** I think this is where I need to change it G_TYPE_NONE, 0); g_signal_connect(G_OBJECT(myWindow), “child-finished”, G_CALLBACK(MyCallback), NULL); 这是我发出信号的代码: gtk_signal_emit_by_name(referenceToMyWindow, “child-finished”); 这是我处理信号的代码: void MyCallback(GtkWidget *w, GdkEvent *e) { // handler code here } 当我运行代码时,我收到以下错误: GLib-GObject-CRITICAL **:g _closure_ invoke:断言`closure-> marshal || closure-> meta_marshal’失败了 我知道它与将marshaller传递给g_signal_new函数有关,但我不知道编组器是什么,我无法理解文档 ,而且在线的例子很少。 如何声明和连接我自己的信号?

C中的测试用例,用于WIFSIGNALED,WIFSTOPPED,WIFCONTINUED

我正在使用waitpid()和signal(),我正在寻找可靠的测试用例,用于返回WIFSIGNALED(状态)= WIFSTOPPED(状态)= WIFCONTINUED(状态)= true但找不到任何… 小心告诉我如何确保返回true,以便我可以调试我的代码? 另外,关于我应该用signal()检测哪些信号以测试这些宏的一些提示会有所帮助……

确定函数是否是异步信号安全的(可以在信号处理程序中调用)

我的问题是: 如果您无法访问其实现,是否有办法确定函数是否是异步信号安全的? 如果没有,有没有办法测试函数是否异步信号安全足以从信号处理程序调用? 如果您读取signal()或sigaction()的手册页,您将获得一个async-signal-safe函数列表(可以在信号处理程序中安全地调用的函数)。 但是,我认为这份清单并非详尽无遗。 例如, Async-signal-safe函数头下的以下页面http://linux.die.net/man/7/signal读取: POSIX.1-2004(也称为POSIX.1-2001技术勘误2)要求实现以保证在信号处理程序内可以安全地调用以下函数: 然后它继续列出上面手册页中列出的正常异步信号安全function。 当我读它时,它说“它需要”,而不是“这些是唯一的”。 例如, 该站点说back_trace_symbols_fd()是异步信号安全的。 该函数获取的是来自dladdr()的数据,并且它不像back_trace_symbols()那样使用malloc(),所以看起来它可能是安全的。 此外,我做了一些测试,并且dladdr()的输出结构包含char *变量,但这些变量在运行时不是malloc。 他们指向的char字符串甚至在调用dladdr()之前就存在于运行时。 任何可以指向正确方向的想法或想法都会受到赞赏。

使用sigaction()

我必须向进程SIGUSR1和SIGUSR2发送两个信号,以便修改程序中的特定布尔变量( SIGUSR1将其设置为true , SIGUSR2将其设置为false )。 所以我写了一个signalHandler()函数来控制SIGUSR1或SIGUSR2的行为。 问题是: 如何设置sigaction()来处理这个特定的任务? 我花了很多时间在谷歌上,我到处读到我应该使用sigaction()而不是过时的signal() 。 在手册页中我找到了这个 int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 在signum我必须把我想要处理的信号类型,然后我有一个struct sigaction参数: struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); }; 在第一个字段中我认为我应该设置我的信号处理程序的名称,但我不知道如何设置其他字段。 最后,有什么用: struct sigaction *oldact ?

如何从信号编号中获取人类可读的描述?

POSIX标准或其他C标准是否提供了一种从信号编号中恢复有意义消息的方法,就像strerror()可以从errno恢复消息一样? Gnu C库有strsignal() ,但是如果可能的话,我想要一些可移植到BSD和其他Unix变种的东西。

C- SIGUSR1究竟是什么语法

当我在kill()或signal()函数中使用SIGUSR1时,它在做什么? 这是一个宏吗? 我读到它是用户定义的,但它在哪里定义? 我可以制作一个SIGUSR10(或以编程方式制作不同信号类型的“arrays”)吗?

如何向C中的进程发送信号?

我需要向一个进程发送一个信号,当进程收到这个信号它会做一些事情时,如何在C中最好地实现?

如何等待子进程发送信号?

#include #include #include #include void handler(int signumber) { return; } int main() { int i, pid; int children_count = 5; int arr_childprocesses[5]; int parent_pid = getpid(); for(i=0;i<children_count;i++) { pid = fork(); if(pid == -1) { perror("Err"); exit(EXIT_FAILURE); } if(pid == 0) break; arr_childprocesses[i] = pid; } if (pid == 0) // children { kill(parent_pid,SIGUSR1); printf("Child(%d) […]