作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以这就是我现在遇到的问题,我创建了 2 个不同的程序(一个将管理另一个,而另一个将执行多次)。这些程序将通过信号来回通信。我的问题是,是否有可能(以及如何)获取发送信号的程序的进程 ID。我的程序使用 signal() 捕获信号并使用 kill() 发送信号。
最佳答案
虽然 signal() 在标准 C 库中,但此函数不可移植,其行为取决于系统。最好使用 POSIX.1 的 sigaction()。
这是一个如何使用 sigaction 和处理程序 void h(int sig) 的示例:
int mysignal (int sig, void (*h)(int), int options)
{
int r;
struct sigaction s;
s.sa_handler = h;
sigemptyset (&s.sa_mask);
s.sa_flags = options;
r = sigaction (sig, &s, NULL);
if (r < 0) perror (__func__);
return r;
}
选项在 man sigaction 中有描述。 options=SA_RESTART
是一个不错的选择。
要知道发送信号的进程的 PID,请设置 options=SA_SIGINFO
,并使用 sa_sigaction
回调代替 sa_handler
;它将接收一个 siginfo_t
结构,具有一个 si_pid
字段。您可以使用 sigqueue
将数据关联到信号。
一般来说,使用信号以安全的方式进行通信是一个坏主意(当发送 n 个信号时,只有第一个有机会被传递;没有关联其他数据的钩子(Hook);可用的用户信号是只有两个)。最好使用管道、命名管道或套接字。
关于C - 获取信令进程的进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130660/
我有一个带有 SpinnerNumberModel 的 jSpinner,如下所示: spinnerModelFix = new SpinnerNumberModel(0, 0, 65535, 1);
我是一名优秀的程序员,十分优秀!