繁体   English   中英

你如何在不改变标准输入缓冲的情况下 fork-then-execve?

[英]How do you fork-then-execve without changing buffering on stdin?

我正在构建一个应用程序,它使用 replxx 或 libedit 从终端读取一行,以及制表符完成。 为了使 replxx 和 libedit 工作,每个库都将 stdio 置于原始无缓冲模式,以便键绑定工作。

在制表符补全期间,以类似于 bash 补全的方式执行工具。 在 fork 和 execve 之后,父应用程序通过 pipe 与工具通信,这一切都很好。

一旦工具完成执行,就会出现问题 - 在父应用程序中,stdin 丢失了其原始无缓冲设置并恢复为行缓冲。 这会破坏 replxx 和 libedit,它们在按下 enter 之前一直保持冻结状态,然后赶上所有行缓冲的按键。

代码需要做什么(或避免做什么)来分叉,然后执行,以使父级中的标准输入保持不变?

最具体地说,在子进程中关闭标准输入是否对父进程中的标准输入在缓冲方面有任何影响?

该代码在 Linux/MacOS 上使用 Apache Portable Runtime,如下所示:

apr_procattr_create(&procattr, first->pool);
apr_file_pipe_create_ex(&ioread, &iowrite, APR_FULL_BLOCK,
            first->pool);
apr_procattr_child_in_set(procattr, NULL, NULL);
apr_procattr_child_out_set(procattr, NULL, NULL);
apr_procattr_child_err_set(procattr, NULL, NULL);
apr_procattr_dir_set(procattr, command->r.sysconf);
apr_procattr_cmdtype_set(procattr, APR_PROGRAM);
proc = apr_pcalloc(first->pool, sizeof(apr_proc_t));
apr_proc_create(proc, command->r.libexec, (const char* const*) argv->elts,
               device_environment_make(d), procattr, first->pool);
apr_file_close(proc->in);
apr_file_close(proc->err);

[do stuff that reads proc->out]

apr_file_close(proc->out);
apr_proc_wait(proc, NULL, NULL, APR_WAIT);

当前replxx在每次回调返回后重置原始模式终端设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM