[英]subprocess.communicate on perf stat does not return expected stdout, stderr
[英]Communicate with a subprocess using pipes on other than stdout/stderr
這是我派生/執行子流程並與之通信(偽代碼)的方式:
int cout_pipe[2];
pipe(cout_pipe);
fork();
if (child)
{
dup2(cout_pipe[1],STDOUT_FILENO);
execv();
}
if (parent)
{
File* cout_file = fdopen(cout_pipe[0], "r");
}
我的問題是:
我真的不想讀取我的子進程的stdout,我希望子進程在stdout之外的文件描述符上寫。 而且,我希望以上代碼從該文件描述符中讀取。
子進程是用python編寫的,python是C ++的主進程。
我想我可以從以下位置更改該行:
dup2(cout_pipe[1],STDOUT_FILENO);
至
dup2(cout_pipe[1],MY_OWN_RANDOM_FD_NUMBER);
並以我寫入MY_OWN_RANDOM_FD_NUMBER而不是stdout的方式對子流程進行編碼。
這是一個好的解決方案嗎? 可行嗎? 我如何找出一個好的MY_OWN_RANDOM_FD_NUMBER? 有更好的選擇嗎?
在您描述的情況下,無需復制文件描述符。 對pipe()的調用已經在cout_pipe數組中創建了所需的文件描述符。
通常,子進程只是在執行之前關閉管道的讀取側,而父進程則關閉管道的寫入側。 子級將所需的任何內容寫入寫側,而父級則讀取或監視管道的讀取側。
如果您的問題是“子進程在執行完后如何知道fd號,那么當您在子進程中調用execv()時,我會說將它作為執行參數傳遞。”
就像是:
int child_pipe[2];
FILE *child_file;
void forkchild(void)
{
int ret;
char child_pipe_fd_str[16];
pipe(child_pipe); /* TODO: check return value! */
if (0 == (ret = fork())) /* child */
{
close(child_pipe[0]);
sprintf(child_pipe_fd_str, "%d", child_pipe[1]);
execv(my_python_script, child_pipe_fd_str, NULL);
}
else if (-1 != ret) /* parent */
{
close(cout_pipe[1]);
child_file = fdopen(cout_pipe[0], "r");
}
else
{
perror("Fork failed!");
abort();
}
}
除非您想要特定的fd(如標准輸出),否則dup2
毫無意義。 只需將cout_pipe[1]
轉換為字符串,然后將其作為命令行參數傳遞給子項(在exec
)。 在Python方面,從sys.argv
獲取參數,將其轉換回int
,然后使用os.fdopen
為其獲取file
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.