问题标签 [sigaction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1242 浏览

c - 无法更改 SIGINT 的默认操作

在 C 中,我想捕获SIGINT信号并通过使用 sigaction 并将新处理程序传递给它通过

我不想终止程序。

如果我通过 shell 运行我的程序并使用 Ctrl+c 生成信号,信号处理程序将捕获信号并打印出我的消息。

之后,它将执行终止进程的默认操作。

我究竟做错了什么?

0 投票
1 回答
1145 浏览

c - 从内部捕获 SIGSEGV 时,如何知道所涉及的无效访问类型?

如您所知,可以捕获任何信号,但可以使用处理程序杀死和停止/计数。
存在三种无效地址访问:

  • 尝试在无效地址处执行/跳转。
  • 尝试读取无效地址。
  • 尝试写入无效地址。

我只对拒绝无效的读取访问感兴趣。所以这个想法是捕捉所有的分段错误,abort()如果它不是无效的读取访问。

到目前为止,我只知道如何使用SEGV_MAPERR,当然SEGV_ACCERRsigaction哪个无关。

0 投票
1 回答
1599 浏览

c - 后台进程的信号处理

我正在尝试在 C 中实现一个简单的 Unix shell。但是,我无法通过使用 sigaction 来实现后台进程功能。我的代码结构如下:

此外,在我的 execCommand 函数中,结构如下:

我的处理程序如下所示:

但是这种结构损害了我的整个实现。甚至前台进程也无法正常工作。当我执行前台命令时,它给出:

当我执行后台命令时,它给出:

那么,我该如何解决这个问题呢?

提前致谢...

编辑:当我用 valgrind 调试我的代码时,它给出了以下内容:

0 投票
0 回答
458 浏览

c - 用 sigaction 用 C 语言处理信号

我正在尝试在 C 中实现一个简单的 unix shell。但是,我的后台进程功能运行不佳。

当我运行 shell 并给出后台命令时,它会给出如下输出:

问题是它给出了一段睡眠时间的输出,而它应该只给出第一个 retval。

我的信号处理程序是

我的签名是

那么,我的代码有什么问题?

提前致谢...

编辑:另外,我有一个 sigaction()

0 投票
1 回答
737 浏览

c - 迷你壳背景

我正在为大学做一个 minishell 项目,但我不知道如何在后台执行命令。我知道的一件事是我必须使用 waitpid() 和 sigaction(),但我不知道如何使用。如果有人帮我解决这个问题,我将不胜感激。这是我使用的部分代码,用于使用 minishell 命令。

}

0 投票
1 回答
724 浏览

c++ - 在 C++ 中捕获 SIGINT 并调用析构函数的程序结构

如何在 C++ 中处理中断信号和调用析构函数有关?,但我的问题围绕着构建程序。

我正在编写一个模拟程序,将数据写入 HDF5 文件。但是在程序中断的情况下,我希望 HDF5 能够正确关闭,这样累积的数据仍然可以读取。我编写了一个包含 HDF5 文件句柄的 HDF5 编写器类,如果调用该类的析构函数,则 HDF5 文件应该关闭。因此,如果 Ctrl-C 中断程序,我想捕获 SIGINT,并调用析构函数。

根据我的阅读,包括如果发出 SIGINT 或 SIGSTP,是否调用析构函数?, 的处理函数sigaction应该很简单,无非就是改变一个标志。这导致了一个如下所示的程序(从第二个链接复制)......

您可以在程序结构中看到while循环中的部分应该足够短,以便程序quit经常检查标志。但我的麻烦是我的程序结构更像这样:

run_simulation将运行我的模拟,直到满足指定的停止条件,这可能需要几分钟/几小时。如何设置我的程序来监视某些标志,以便在及时收到 SIGINT 后关闭它?

0 投票
1 回答
140 浏览

c - sigaction 和 sigset_t 在 Solaris 和 Linux 之间的可移植性

我在 Solaris 平台上有一些遗留代码,我想将其移植到 Linux,但我在 Linux 上遇到了一些编译错误。在 Solaris 上,我有以下代码片段:

当我尝试使用 gcc 4.9.2 在 Linux 上编译时(在 Solaris 上编译正常),我收到以下编译错误:

... 同样对于__sigbits[1], __sigbits[2],__sigbits[3]也是如此。

Linux中是否有任何等价物?

0 投票
0 回答
385 浏览

c - C - 使用 dup 将标准输出重定向到 execl(二进制文件)的输入

我需要以下程序的帮助,它应该 fork() 两个孩子,child1 应该发送两个随机数,在一个用空格分隔的字符串中,到 child2 槽管道,等待 1 秒然后再做一次,直到它收到来自父母的 SIGUSR1 (父母在 5 秒后发送)。child2 应该运行“main.exe”二进制文件,将管道的输出重定向到 main.exe 的输入,并将 main.exe 的输出重定向到 out.txt 文件。main.exe 二进制文件本身就可以正常工作,它位于应用程序文件夹中。

这是学校的作业。我已经设法使用写入和读取功能将字符串从 child1 发送到 child2。但是部分作业是每次我重定向输出或输入时,我必须使用 dup(int a, int b) 函数。我也应该让 child1 接受?使用 sigaction 的 SIGUSR1,(当收到孩子 1 应该在 stderr 上打印 'TERMINATED' 并终止)-> 我不知道该怎么做。该程序成功完成但似乎没有做任何事情,child1 中的 printf 部分似乎无法按我的预期工作。任何帮助将不胜感激。

0 投票
2 回答
1044 浏览

c - 为什么 alarm() 导致 fgets() 停止等待?

我正在用 C 语言处理信号。我的主要功能基本上是使用 请求一些输入fgets(name, 30, stdin),然后坐在那里等待。我用 设置了一个警报alarm(3),并重新分配了 SIGALRM 来调用一个myalarm简单地调用system("say PAY ATTENTION"). 但是警报响起后,fgets()停止等待输入,我的主 fn 继续。即使我更改myalarm为仅设置一些变量并且不对其执行任何操作,也会发生这种情况。

为什么alarm()makefgets()停止等待输入?

编辑:为我的catch_signal函数添加了代码,并且根据评论之一,使用sigaction而不是signal,但问题仍然存在。

0 投票
1 回答
231 浏览

signals - 为什么只能从信号处理程序调用异步安全函数?

我知道,从信号处理函数中,sigaction()我应该只调用那些“异步安全”的函数。但为什么会这样?