如何将" Ctrl+C"发送到Node.js中的子进程?
我尝试产生子过程-VVP( var child = require('child_process'); var fs = require('fs'); var vcdGen = child.spawn('vvp', ['qqq'], {}); vcdGen.stdout.on('data', function(data) { console.log(data.toString()) }); setTimeout(function() { vcdGen.kill('SIGINT'); }, 400); 在这种情况下,停止了儿童过程. 我也尝试了vcdGen.stdin.write('\x03')而不是vcdGen.kill('SIGINT');,但它不起作用. 也许是因为Windows? 有什么方法可以实现与我在CMD中相同的行为? 解决方案 kill仅真正支持Windows上的粗鲁过程杀死 - Windows中的应用信号模型, *NIX不兼容.您无法通过标
0 2023-12-06
编程技术问答社区
我可以向 Windows 上的 Python 子进程发送 SIGINT 吗?
我有一个Python脚本在Windows上管理GDB流程,我需要能够将Sigint发送到产卵过程中,以便停止目标过程(由GDB管理) 看来Win32中只有Sigterm可用,但是显然,如果我从控制台和CTRL+C运行GDB,它认为它正在接收Sigint.有什么方法可以伪造它,以便在所有平台上都可以使用该功能? (我使用的是子进程模块,而Python 2.5/2.6) 解决方案 Windows没有UNIX信号IPC机制. 我会考虑将CTRL-C发送到GDB流程.
2 2023-12-06
编程技术问答社区
相当于 "SIGINT"(posix)信号,用于捕捉Windows/MinGW下的 "CTRL+C"。
我正在Windows下移植Linux/GCC程序,并实现了两者的常见异常处理.我想知道SIGINT mingw/gcc的信号等效. 这是我在Linux下处理的方式: static void handler(int sig) { // Catch exceptions switch(sig) { case SIGABRT: fputs("Caught SIGABRT: usually caused by an abort() or assert()\n", stderr); break; case SIGFPE: fputs("Caught SIGFPE: arithmetic exception, such as divide by zero\n", stderr); break; case SIGILL: fputs
6 2023-12-05
编程技术问答社区
我可以在Windows上向一个应用程序发送ctrl-C(SIGINT)吗?
我有(过去)书面的跨平台(Windows/unix)应用程序,从命令行启动时,处理用户类型的 ctrl - c >以相同方式组合(即干净地终止应用程序). 在Windows上可以在Windows上发送 ctrl - c /sigint/sigint/等同于从另一个(无关的)过程中的一个过程,以要求其终止(提供它)一个整理资源等的机会.)? 解决方案 我最接近解决方案的是 sendsignal 第三方应用程序.作者列出了源代码和可执行文件.我已经证实了它在64位窗口下工作(作为32位程序运行,杀死另一个32位程序),但我没有弄清楚如何将代码嵌入到Windows程序中(要么32位.或64位). 如何工作: 在调试器中进行了大量挖掘之后,我发现实际执行与Ctrl-Break这样的信号相关的行为的入口点是Kernel32!ctrlRoutine.该函数具有与ThreadProc相同的原型,因此可以直接与CreateMoteThread一起使用,而无需注入代码.但是,这不
4 2023-12-05
编程技术问答社区
Ctrl+C不能杀死Sinatra+EM::WebSocket服务器
我正在构建一个Ruby应用程序,该应用程序既可以运行EM :: WebSocket Server和Sinatra Server.我个人认为,这两者都有能力处理Sigint.但是,当在同一应用中运行两者时,当我按CTRL+c时,该应用程序会继续.我的假设是其中一个正在捕获Sigint,也阻止了另一个也捕获了它.我不确定如何修复它. 这是简而言之的代码: require 'thin' require 'sinatra/base' require 'em-websocket' EventMachine.run do class Web::Server
2 2023-12-02
编程技术问答社区
如何在Linux上的VS代码上捕获CTRL+C Inside C程序?
在Linux上的VS代码中编码C. 我使用; signal(SIGINT, myhandler); signal(SIGHUP, myhandler); signal(SIGKILL, myhandler); signal(SIGTERM, myhandler); 我使用VS代码内部终端,"在终端中运行"选项. 当我的代码在循环中运行时,当我发送键Ctrl-C时,执行会停止,但信号并未被我的代码捕获(MyHandler). 我在.gdbinit文件中添加了"处理所有Nostop Print Pass",但没有任何更改. 问题是,如何在我的程序中从键盘中发送的Ctrl-C(Sigint)当前在VS代码中调试? 要详细说明,我将添加我的启动. { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing a
0 2023-11-25
编程技术问答社区
在自己的处理程序中抓取信号
#include #include void handler(int signo) { printf("Into handler\n"); while(1); } int main() { struct sigaction act; act.sa_handler = handler; act.sa_flags = 0; sigemptyset(& act.sa_mask); sigaction(SIGINT, &act, NULL); while(1); return 0; } 捕获键盘线路一次,当我再次按" ctrl+c"时,sigint又不处理... 我打算每次"进入处理程序" 时,请按i 按" ctrl+c" . . 我想在" Sigint Handler()"本身中捕获SIGINT .. 解决方案 您需要在sa_mask上设置sa_nodefer以捕获与
4 2023-11-08
编程技术问答社区
Ctrl-C和SIGINT的区别是什么?
我一直在调试一个python程序,该程序在收到KeyboardInterrupt例外后进行了segfault.通常,这是通过从外壳按下 ctrl+c 来完成的.要测试特定代码是否修复了该错误,我有一个小的shell-script,该算法在启动后随机发送到程序.我的问题是,发送 ctrl+c 似乎对程序的影响与发送信号SIGINT的影响不同,因此不会导致错误出现,所以我很想知道区别是什么.然后在两个动作之间. 该程序根本不会捕获任何键盘操作,而只是一个带有某些线程/进程的Python程序.它安装了没有信号处理程序(尽管Python确实如此),并且stty -a给出intr = ^C.我怀疑可能是 ctrl+c 将SIGINT发送到所有子过程/线程时,kill -INT kill -INT kill -INT kill -INT kill -INT kill -INT,但这是我的怀疑. 这是发送kill -INT的shell脚本. wait while :; do se
6 2023-11-08
编程技术问答社区
向在Eclipse控制台运行的程序发送SIGINT(Ctrl-C)。
我已经在Eclipse中设置了运行配置,需要将SIGINT( ctrl + c )发送到程序. SIGINT之后的程序中有清理代码,因此按Eclipse的"终止"按钮无法正常工作(我认为它们会发送Sigkill).键入 ctrl + c 在控制台中也行不通. 如何将SIGINT发送到Eclipse控制台内运行的过程? (fwiw我正在运行一个扭曲的守护程序,需要扭曲以正确关闭,这仅在sigint上发生) 解决方案 如果您可以用PS等实用程序确定该过程,则可以使用Kill将其发送Sigint.该程序可能是Eclipse的儿童过程. kill -s INT 其他解决方案 您可以通过一行发送命令: kill -SIGINT $(ps aux | grep ProgrammName | grep -v grep | awk '{print $2}') 获取过程ID,而不是发送Sigint信号 其他解决方案 这似乎仍然是一个空旷的问
4 2023-10-28
编程技术问答社区
将SIGINT信号委托给子进程,然后清理并终止父进程。
我有一个主python(testmain.py)脚本,该脚本使用subprocess.popen命令执行另一个python脚本(test.py).当我按CTRL-C时,我希望孩子使用退出代码2退出,然后父母显示出口代码,然后终止. 我在父母和子脚本中都有信号处理程序. testmain.py def signal_handler(signal, frame): print "outer signal handler" exit(2) signal.signal(signal.SIGINT, signal_handler) def execute() proc=subprocess.Popen("python test.py",shell=True) streamdata=proc.communicate()[0] rc=proc.returncode print "return code:",rc execute() t
34 2023-10-04
编程技术问答社区
如何阻止SIGINT在python中被传递给子进程?
我的python脚本用信号 process 模块拦截了Sigint信号,以防止过早出口,但是此信号传递给了我与Popen打开的子过程.是否有某种方法可以防止将此信号传递给子过程,以便当用户按CTRL-C? 时也不会过早退出. 解决方案 您可以使用这是一个简单的代码段,可以让您启动,以存储您的旧TTY设置,将CTRL-C重新分配到Ctrl-X,然后在退出时还原您以前的TTY设置. import sys import tty # Back up previous tty settings stdin_fileno = sys.stdin.fileno() old_ttyattr = tty.tcgetattr(stdin_fileno) try: print 'Reassigning ctrl-c to ctrl-x' # Enter raw mode on local tty tty.setraw(stdin_fileno) raw_t
4 2023-10-04
编程技术问答社区
如何用Python subprocess.Popen()将SIGINT传递给子进程,使用shell = true
我当前正在尝试编写(Python 2.7.3)GDB的包装器,这将使我能够动态地从脚本输入转换为与GDB的交互式通信. 到目前为止我使用 self.process = subprocess.Popen(["gdb vuln"], stdin = subprocess.PIPE, shell = True) 在我的脚本中启动GDB. (vuln是我要检查的二进制文件) 由于GDB的关键功能是暂停执行附件的过程,并允许用户在接收Sigint(strg+c)时检查寄存器和内存,所以我确实需要某种方法将Sigint信号传递给它. 都不 self.process.send_signal(signal.SIGINT) nor os.kill(self.process.pid, signal.SIGINT) 或 os.killpg(self.process.pid, signal.SIGINT) 为我工作. 当我使用以下功能之一时,没有响应.我
14 2023-10-04
编程技术问答社区
Python。如何防止子进程接收CTRL-C / Control-C / SIGINT
我目前正在为在外壳中运行的专用服务器处理包装器.包装器通过子过程产生服务器过程,并观察并对其输出做出反应. 必须明确给出专用服务器,以优雅地关闭.因此,CTRL-C不得达到服务器过程. 如果我捕获了键盘线路异常或覆盖Python中的Sigint操纵器,则服务器进程仍然接收CTRL-C并立即停止. 所以我的问题是: 如何防止子过程接收Ctrl-C/Control-C/Sigint? 解决方案 #Python irc-channel中的某人(FreeNode)指出了 preexec_fn subprocess.popen.popen(...)的参数来帮助我/p> 如果 preexec_fn 设置为可呼叫 对象,此对象将被调用 孩子的过程就在 孩子被执行. (仅UNIX) 因此,以下代码解决了问题(仅UNIX): import subprocess import signal def preexec_function(): # Ignore
18 2023-10-04
编程技术问答社区
在Golang中防止Ctrl+C中断exec.Command。
我注意到,即使通过signal.Notify拦截了中断呼叫,过程始于exec.Command被中断.我已经完成了以下示例以说明问题: package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") } func main() { var doneChannel = make(chan bool) go sleep() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, s
16 2023-10-04
编程技术问答社区
使用ganymed SSH2发送SIGINT CTRL-C?
我需要杀死我已经开始使用ganymed ssh2的过程.具体来说,我想使用 ctrl + c 优雅地杀死它.我已经看到了尝试发送ASCII \x03的想法,但是当使用ExecCommand()时,它不会逃脱.如何通过ganymed发送 ctrl + c sigint? 如果还有另一个Java SSH应用程序,我应该使用我,我已经研究了JSCH,SSHJ,但刚刚发现了最简单的ganymed ssh2. 我试图杀死的程序是tethereal(Wireshark) 解决方案 我已经与JSCH一起使用了此此事,以成功发送 ctrl + c : JSch jsch = new JSch(); Session session = jsch.getSession(user, host); session.setPassword(password); session.connect(timeout); Channel channel = session.openChannel(
10 2023-09-27
编程技术问答社区
如何通过SSH向一个远程进程发送SIGINT?
我有一个在远程计算机上运行的程序,该程序希望从父母那里接收Sigint.该程序需要接收该信号以正常运行.不幸的是,如果我通过SSH远程运行该过程并发送SIGINT,则SSH过程本身会捕获和中断而不是转发信号. 以下是使用GDB的此行为的示例: 本地运行: $ gdb GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul 3 01:19:56 UTC 2009) ... This GDB was configured as "x86_64-apple-darwin". ^C (gdb) Quit ^C (gdb) Quit ^C (gdb) Quit 远程运行: $ ssh foo.bar.com gdb GNU gdb Red Hat Linux (6.3.0.0-1.159.el4rh) ... This GDB was configured as "i386-redhat-linux-gnu"
6 2023-09-27
编程技术问答社区
Java的信号处理,然后返回到主程序
mi的程序从循环开始,它旋转10次,一个循环持续一秒钟.我需要处理信号(CTRL+C),并且在处理该信号时,它应该可以自行执行循环,然后停止后,我应该返回主循环.我已经设法完成了上面几乎所有的操作,但是循环不会单独执行.他们平行.希望您能提供帮助...谢谢:) 顺便说一句,我的代码是: import sun.misc.Signal; import sun.misc.SignalHandler; public class MySig { public static void shhh(int s){ //s -> seconds :) s = s*1000; try{ Thread.sleep(s); }catch(InterruptedException e){ System.out.println("Uh-oh :("); } } pub
6 2023-09-03
编程技术问答社区
如何清理SIGINT处理程序中的本地数据
我需要在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); } 如何实施这种行为?我已经尝试使此变量是全局的,但是 我无法在编译时间调用此功能(错误:初始
4 2023-09-03
编程技术问答社区
不确定如何通过完成还是信号终止子过程
我正在尝试编写一个程序, 我的父进程应该能够忽略sigint信号,另一方面,我的孩子过程, 应该执行Sigint信号的默认函数. 最后,我应该找出子过程是否被任何特定信号终止. 我的子进程基本上执行了execvp( ),基于一些输入. 因此,我尝试做同样的事情的方法是,我为父母过程添加了一个sigint处理程序,我的猜测是execvp()何时execvp()调用功能,子进程将使用默认处理程序执行SIGINT进程. void sigint_handler(int signum){ printf(""); } int main(int argc, char **argv){ pid_t pid = fork(); if(pid0){ int status; signal(SIGINT,sigint_handler); pid
16 2023-09-03
编程技术问答社区
Perl在bash中捕获Ctrl-C(sigint)。
我正在阅读我们如何捕获Ctrl ^ c -Perl Monks ,但是我似乎无法获取正确的信息来帮助解决我的问题. 事实是 - 我有一个无限的循环,"多行"打印输出到终端(我知道我会被告知使用ncurses - 但是对于简短的脚本,我更舒服写一堆printf s ).我想以这样的方式捕获Ctrl-C,以至于脚本仅在此多行打印输出完成后才终止. 脚本为(Ubuntu Linux 11.04): #!/usr/bin/env perl use strict; use warnings; use Time::HiRes; binmode(STDIN); # just in case binmode(STDOUT); # just in case # to properly capture Ctrl-C - so we have all lines printed out # unfortunately, none of this works: my $toex
14 2023-09-03
编程技术问答社区