Skip to content

v0.4.5 regression: bash exits immediately with code 0, no output #49

@Bahtya

Description

@Bahtya

问题描述

v0.4.5 中 bash 启动后立即以 exit code 0 退出,终端没有任何输出。v0.4.3 没有此问题。

复现

Hermux 调用:

session_id = vproc_ffi_create_session();
vpid = vproc_ffi_create_process(session_id, "/path/to/bash", argv, envp, pts, pts, pts);

Logcat

08:15:45.250  vproc: created session 3
08:15:45.250  vproc: self-test skipped (probe=ok)
08:15:45.260  vproc: virtual process created vpid=1 session=3 ptm=143
08:15:45.271  waiter: entering waitFor pid=1 sessionId=3
08:15:45.271  vproc: run_until_exit_s(vpid=1) returned 0
08:15:45.271  vproc: destroying session 3

从创建到退出仅 ~20ms,bash 没有产生任何输出到 PTY。

根因分析

v0.4.4/v0.4.5 新增的 setsid() 可能导致:

  • bash 启动后发现自己不是前台进程组的一部分,直接退出
  • 或者 setsid() 后 PTY slave 的 fd 连接断了(bash 的 stdin 变成无效 fd)
  • bash 以交互模式启动时如果无法获得 controlling terminal,会直接 exit(0)

与 v0.4.4 的 SIGSEGV 不同(v0.4.4 在 set_signal_handler 崩溃),v0.4.5 改为了静默退出。

影响对比

  • v0.4.3: bash 正常工作,有 job control 警告
  • v0.4.4: bash SIGSEGV 崩溃
  • v0.4.5: bash 立即退出,无输出

建议

setsid() 在 vproc 协程环境中可能无法正确工作。可能需要:

  1. 在 vproc 层面模拟 session/controlling terminal 语义,而非调用真正的 setsid()
  2. 或者让 setsid() 成为可选的,通过参数控制是否启用
  3. 或者让 vproc 在 setsid 后重新打开 PTY slave fd 并传递给 bash

相关

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions