- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试向 ruby-newt
模块添加一些自动化测试。我的代码似乎可以工作,但仍然需要在终端手动点击 ENTER
才能完成。
例如在下面的代码中,\t
会切换到下一个按钮,\r
会按下按钮,两个命令都执行成功,但是ENTER
键仍然需要在终端手动按下,否则程序将无限期挂起。
如果wr.write "\t\r"
这一行被注释掉,那么程序会超时,10秒后成功退出。我试过 wr.flush
,但没有用。我也试过在命令中包含 \n
。
我应该在 write
命令中添加什么以确保子程序成功接收它吗?
require 'newt'
require 'pty'
def newt_run
begin
Newt::Screen.new
Newt::Screen.centered_window(20, 15, 'Button')
b1 = Newt::Button.new(1, 1, 'Button1')
b2 = Newt::Button.new(1, 6, 'Button2')
b = Newt::Button.new(1, 11, 'Exit')
f = Newt::Form.new
f.set_timer(10000)
f.add(b1, b2, b)
rv = f.run
ensure
Newt::Screen.finish
end
end
master, slave = PTY.open
rd, wr = IO.pipe
if fork.nil? then
master.close
wr.close
$stdin.reopen(rd)
$stdout.reopen(slave)
$stderr.reopen(slave)
newt_run
else
slave.close
rd.close
wr.write "\t\r"
Process.wait
end
最佳答案
问题是 newt C 库默认打开 /dev/tty
进行输入。它不使用标准输入。这就是为什么您发送的任何内容似乎都不起作用。它不是在读取您的管道,而是在读取 /dev/tty
。
这里是更详细的问题:
newtInit()
newtInit()
调用 SLang_init_tty
SLang_init_tty
默认始终将输入附加到 /dev/tty
。如果你read the documentation在 SLang_init_tty
中,您会发现变量 SLang_TT_Read_FD
决定是否使用 /dev/tty
。
解决方案 1:
在从 Ruby 调用 newtInit()
之前,您需要将 SLang_TT_Read_FD
设置为 stdin
。
解决方案 2:
使用 setsid
和 ioctl(TIOCSCTTY)
重新分配派生进程中的控制终端(参见 docs for ioctl here )。
工作示例:
TIOCSCTTY = 0x540E
master, slave = PTY.open
if fork.nil? then
# Child process
# Make group leader. Required for aquiring controlling TTY.
Process.setsid
master.close # Close master side
STDIN.reopen(slave) # Reassign STDIN
STDIN.ioctl(TIOCSCTTY, 0) # Reassign controlling TTY (important part)
# Ensure master is ready
slave.gets
# Now we can run the UI
newt_run
else
# Parent process
slave.close
# Sync up with slave
master.puts 'hello'
# Allow for UI setup
sleep 1
master.write "\e[B" # Arrow down
master.write "\e[B" # Arrow down
master.write "\t" # Tab
master.write "\r" # Enter
Process.wait
end
关于ruby:以原始模式将击键发送到 PTY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58634512/
menu Home Events Technical Schedule
我试图阻止触发默认 anchor 链接和 onclick 事件。 这是 HTML 代码: Google 我正在尝试使用以下 jQuery 代码阻止任何重定向的发生: $("#mylink").cli
我想在单击父 div 上的任意位置时切换我的 div,除非单击 anchor 元素。因此,例如,如果我单击示例中的第一个文本,我希望它切换,但在我的示例中的第二个文本上,我不希望它切换。 JSFidd
我在通过 jQuery 伪造 anchor 点击时遇到问题:为什么我的thickbox在我第一次点击输入按钮时出现,但第二次或第三次却没有出现? 这是我的代码: Link 当我直接点击链接时,它总是
我已经从 Mootools 切换到 jQuery,因为我认为它有更好的支持。我有这样的 HTML: Opcje Opcje Opcje Opcje Opcje Opcje Opcje JS
我是一名优秀的程序员,十分优秀!