aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 10850|回复: 6

使用process.popen启动一个程序,程序运行期间如何向程序发送命令!

[复制链接]

9

主题

28

回帖

256

积分

二级会员

积分
256
发表于 2017-10-22 18:12:05 | 显示全部楼层 |阅读模式
举个例子:
  1. import win.ui;
  2. import winex;
  3. import process.popen;
  4. import console;
  5. p=process.popen("ping.exe","127.0.0.1 -t")
  6. for( all,out,err in p.each() ){
  7.    console.log(out)
  8. }
复制代码

如果需要终止ping的运行,并且获取统计信息该怎么办?
使用
process.process.terminate();
的话不会返回下图的统计信息

kernel的AttachConsole()、SetConsoleCtrlHandler()、GenerateConsoleCtrlEvent()这三个API到是能做到,
我就想问问aardio的process.popen能不能实现!

9

主题

28

回帖

256

积分

二级会员

积分
256
 楼主| 发表于 2017-10-22 18:30:07 | 显示全部楼层
需要发送一个CONTROL+C

170

主题

2169

回帖

1万

积分

管理员

积分
13161
发表于 2017-10-22 18:42:02 | 显示全部楼层
renmaoer 发表于 2017-10-22 18:30
需要发送一个CONTROL+C


CTRL + C 你自己的进程也退出了,
这个很简单 ,你要调用API你就调好了  ::Kernel32.GenerateConsoleCtrlEvent(0,0)

区别是 terminate() 只是退出ping进程,
而 CTRL + C 是把你们俩都干掉,不要想去拦截这个事件,首先是你不会成功,即使不退出那他还会继续ping,

你给了个无限ping 的参数,又要他能自己退出,怎么想的?!

9

主题

28

回帖

256

积分

二级会员

积分
256
 楼主| 发表于 2017-10-22 18:47:52 | 显示全部楼层
Jacen.He 发表于 2017-10-22 18:42
CTRL + C 你自己的进程也退出了,
这个很简单 ,你要调用API你就调好了  ::Kernel32.GenerateConsoleC ...

SetConsoleCtrlHandler(0,true)这个函数不是可以防止自己被干掉吗?网上搜的!

点评

是可以防止被干掉,然后 ping 又可以无限ping 了,前面的帖子里已经讲过  发表于 2017-10-22 19:07

170

主题

2169

回帖

1万

积分

管理员

积分
13161
发表于 2017-10-22 19:03:42 | 显示全部楼层
如果你直接打开进程,那你可以通过控制台关闭子进程,
ping.exe 可能拦截了Ctrl + C,在被干掉以前抓紧输出了一点信息。

管道只是读写数据,不能操作控制台,所以对你的问题我的回答是:不能
你可以通过管道写命令,或者让他退出(如果他接受这样的指令)。
否则只能杀进程。

如果你只是要控制ping,倒不必要这么复杂,
你可以自己写一个 ping程序,不用调用 ping.exe。
import console;
import icmp.ping;

var ip = "www.baidu.com";
console.log(
"ping......");

var ping = icmp.ping();
for(i=1;4;1){
   
if( ping.perform(ip) ){
        console.printf(  
"Reply from %s: bytes=%d time=%dms TTL=%d"
            , ping.ip , #ping.requestData  , ping.echoReply.roundTripTime , ping.echoReply.options.ttl  )
    }   
}  

console.pause(
true);

多看看范例这些都有的。

9

主题

28

回帖

256

积分

二级会员

积分
256
 楼主| 发表于 2017-10-22 19:18:14 | 显示全部楼层
Jacen.He 发表于 2017-10-22 19:03
如果你直接打开进程,那你可以通过控制台关闭子进程,
ping.exe 可能拦截了Ctrl + C,在被干掉以前抓紧输出 ...

嗯,就是刚开始学,好多东西不太明白,也不知道从哪里入手,就想进论坛看看,有没有什么启发!范例什么的我也有在看,感觉自己还是有进步的!,就是举个例子,要做的是ESET NOD32的命令行杀毒ECLS的界面,之前有用C#做过(可以正常中止),不过感觉不如AARDIO来的方便,刚好看到管道这一块,可以访问进程读写,我就寻思着是不是可以用AARDIO管道发送命令,感谢版主,我在研究研究!
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-9-15 20:57 , Processed in 0.058772 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表