在父进程中,开启一个子进程,如何在不影响子进程的情况下,将父进程关闭掉
@lgn21st 应该说只有 windows 的子进程不受父进程影响...
但是 system, exec 都是等待子进程完成才结束的
创建独立进程可以用 win32-process http://rubydoc.info/gems/win32-process/0.7.1/frames
1.9 用 Process.spawn http://rubydoc.info/stdlib/core/Process.spawn
#6 楼 @dreamskyvt 知道为什么 windows 叫 windows 么?就是因为程序都必须有一个窗口... 所谓后台程序只是把窗口隐藏了而已... 你可以用 win32api GetConsoleWindow()
获得控制台窗口句柄,然后用 ShowWindow(hwnd, SW_HIDE)
把它隐藏了...
用户懒得装 gem 有各种绕过去的办法,例如你可以在脚本里
begin
require '...'
rescue LoadError
system "gem install ..."
end
或者用 OCRA 把 ruby 和 gem 和脚本打包成一个可执行文件 (以前室友给游戏汉化组做的打包工具就是这么干的...), 或者你可以写一个 msi installer 在里面拷文件,各种奇技淫巧都有...
#2 楼 @dreamskyvt 例子
fork do
5.times do
sleep 1
puts "I'm an orphan!"
end
end
abort "Parent process died..."
不过我没有 windows 上的进程相关的知识,经验。估计 cygwin 也不符合你的需求。还是拜一下 @luikore 大神,他的方案看起来非常靠谱。
在 windows 下 用 Process.spawn 就 OK。 Windows 下的进程之间的关系相对 Unix 要简单的多啦:)
puts 'Notepad start...'
Process.spawn 'notepad.exe'
这个脚本在 windows 下,ruby 进程在创建完 notepad 进程后就结束,也不会影响到 notepad 进程。完全满足你的需要。
#16 楼 @dreamskyvt 其实 @luikore 在 5 楼已经提到了 Process.spawn. ;)
如果你是使用 Ruby 1.8,而且又不想安装其他 gem 的话,你可以直接用 Win32API 来调用 WinExec 来完成类似的工作。当然,CreateProcess 也可以,但是参数啰嗦,WinExec 只有 2 个参数。
require "Win32API"
WinExec = Win32API.new('kernel32.dll', 'WinExec', 'PI', 'I')
WinExec.call 'notepad.exe', 1
我的测试环境是:WinXP,Ruby 1.8.6, Ruby 1.8.7, Ruby 1.9 都可以运行。