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

问题描述

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

在 tab 补全期间,工具以类似于 bash 补全的方式执行。在 fork 和 execve 之后,父应用程序通过管道与工具通信,这一切正常。

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

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

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

代码在 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);
apr_procattr_child_err_set(procattr,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,APR_WAIT);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)