簡體   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