我正在尝试创建一个子进程,然后将SIGINT发送给子进程而不终止父进程.我试过这个:
pid=fork();
if (!pid)
{
setpgrp();
cout<<"waiting...\n";
while(1);
}
else
{
cout<<"parent";
wait(NULL);
}
Run Code Online (Sandbox Code Playgroud)
但当我点击Cc时,两个过程都被终止了
我一直致力于Linux下的多线程程序,对信号处理有特殊要求.例如,我需要程序打印单个Ctrl-C输入的统计信息.
我使用pthread_sigmask和sigwait来实现它,即我在创建其余线程之前阻止主线程中的所有非关键信号,并且我启动了在sigwait上阻塞的"捕获器"线程.
初始化(主要):
sigfillset(&set);
sigdelset(&set, SIGSEGV);
sigdelset(&set, SIGBUS);
sigdelset(&set, SIGILL);
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
handle_error_en(s, "pthread_sigmask");
s = pthread_create(&signal_thread, NULL, &sig_thread, (void *) &set);
if (s != 0)
handle_error_en(s, "pthread_create");
Run Code Online (Sandbox Code Playgroud)
捕手线程例程:
void *sig_thread(void *arg) {
sigset_t *set = (sigset_t *) arg;
int s, sig;
pthread_detach(pthread_self());
for(;;) {
s = sigwait(set, &sig);
if (s != 0)
handle_error_en(s, "sigwait");
switch(sig) {
case SIGINT:
break;
case SIGTERM:
break;
case SIGUSR1:
break;
case SIGUSR2:
break;
default:
break;
}
} …Run Code Online (Sandbox Code Playgroud) 看起来像
trap on_sigint SIGINT
Run Code Online (Sandbox Code Playgroud)
一旦SIGINT被抓住就停止脚本.然后,on_sigint执行.是否可以在SIGINT不停止脚本的情况下处理?
我正在使用https://github.com/gorilla/mux中的 gorilla多路复用器库构建服务器.问题是,当我使用Ctrl + C或者有特定的API调用时,我希望它能够正常关闭,例如"/ shutdown".
我已经知道在Go 1.8中,已经实现了正常关闭.但是如何将它与大猩猩多路复用器结合起来呢?另外,如何将它与SIGINT信号结合起来?
谁能告诉我怎么做?
我需要终止一个我已经开始使用 ganymed SSH2 的进程。具体来说,我想使用Ctrl+优雅地杀死它C。我已经看到了尝试发送 ASCII 的想法,\x03但是在使用 execCommand() 时它不会使用转义字符。如何通过ganymed发送Ctrl+ CSIGINT?
如果我应该使用另一个 Java SSH 应用程序,请告诉我,我已经研究了 Jsch、sshj,但发现 ganymed ssh2 是最简单的。
我试图杀死的程序是 tethereal (wireshark)
我有一个简单的程序,使用select和类似的东西多路复用IO.
为了中断"服务器"进程,我集成了一个对SIGINT做出反应的sig_handler .
每次分配内存时,contains方法都会执行free本身或调用方法.
使用valgrind显示,有一些分配没有被释放.
也许没有必要,但我想了解处理信号的最佳方法.按STRG + C
似乎free不会调用调用.
因此,使用中断条件退出循环将是毫无意义的,这是我的第一种方法.
在关闭整个程序之前,有没有可能清理所有东西?
感谢任何提示和建议.
我需要在SIGINT处理程序中执行清理功能,但无法将本地数据传递给它。这里是一个例子:
int main(int argc, char *argv[]) {
struct database *db = db_cursor();
sockfd_t master_socket = init_server();
signal(SIGINT, sigint_handler);
while (1) {
// accepting connections
}
}
void sigint_handler(int s) {
destroy_db(db);
shutdown(master_socket, SHUT_RDWR);
close(master_socket);
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
我该如何实施这种行为?我试过使此变量为全局变量,但无法在编译时调用此函数(错误:initializer元素不是编译时常量)。
使用这个答案作为参考,我试图在我的 swift linux 脚本中实现一个信号处理程序,它将使程序保持活动状态直到 Ctrl-C,然后在收到 SIGINT 时运行一些清理。使用该答案中的代码在主函数中效果很好:
import Dispatch
import Foundation
signal(SIGINT, SIG_IGN) // // Make sure the signal does not terminate the application.
let sigintSrc = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main)
sigintSrc.setEventHandler {
print("Got SIGINT")
// ...
exit(0)
}
sigintSrc.resume()
dispatchMain()
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将信号处理程序移动到一个函数中,如下所示:
public func registerSigint() {
signal(SIGINT, SIG_IGN)
let sigintSrc = DispatchSource.makeSignalSource(signal: SIGINT, queue: .main)
sigintSrc.setEventHandler {
print("Got SIGINT")
exit(0)
}
sigintSrc.resume()
}
Run Code Online (Sandbox Code Playgroud)
...
registerSigint()
dispatchMain()
Run Code Online (Sandbox Code Playgroud)
程序在 CTRL-C SIGINT 上无限期挂起。为什么这表现不同?
为什么下面的空程序在 Linux 上以 130 退出Ctrl(C这是我怀疑的,因为我的 shellbash将 SIGINT 包装为 130 (128+2)。
在使用Git Bash ( )的 Windows 上git-bash.exe,我得到退出代码 2。
package main
func main() {
for {
}
}
Run Code Online (Sandbox Code Playgroud)
这是 Go 在 Windows 上的行为还是git-bash.exe?因为我2内部需要退出代码,所以我需要使用signal包来包装它吗?
我尝试搜索 Node.js 源代码,但找不到它。默认情况下,在以下示例中,我在哪里可以找到默认处理 SIGINT ( Ctrl+ )的 Node.js 代码:C
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(200);
res.end('Hello Http');
});
server.listen(5001);
Run Code Online (Sandbox Code Playgroud)