我有兩個可執行文件 - 父進程,它是子進程,以長模式運行(例如服務器等)。我需要的只是將孩子的stdout和stderr重定向到父進程,並將它們寫入文件或打印到tty,現在無所謂。將輸出從長時間運行的孩子重定向到父進程
如果我們談論簡單的孩子,這是非常簡單的任務,但與長期運行的孩子與部分輸出是一個問題。
例如,讓我們來看看有pipe
的使用(錯誤檢查和其他非重要部位略)流行的解決方案:
parent.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int link[2];
pid_t pid;
char str[4096];
pipe(link);
pid = fork();
if (pid == 0) {
dup2(link[1], STDOUT_FILENO);
close(link[0]);
execl("/path_to_bin/fast_child", "fast_child", (char *)0);
}
else
{
close(link[1]);
read(link[0], str, sizeof(str));
printf("Pipe contents: %s\n", str);
wait(NULL);
}
return 0;
}
fast_child.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf("I'm fast child\n");
return 0;
}
在e中使用這種類型的子進程xcellent和非問題的方式來獲得STR(出|錯誤)的母公司,但使用此代碼作爲父消失輸出的孩子帶來問題:
slow_child.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
for (;;)
{
printf("I'm slow child\n");
sleep(1);
}
return 0;
}
我考慮使用套接字作爲解決問題的解決方案,但我相信這不是那麼有效的方式,Unix提供了更好的工具來完成這項工作(如往常一樣:)
謝謝。
究竟是什麼,你有問題?你不知道什麼時候你會收到孩子的輸入(可以用'select'來解決)?你不希望父母在'wait'的調用中被阻塞(可以用'waitpid'或'wait4'解決'WNOHANG'標誌)?還有別的嗎? –
好的,我想在一個小孩的所有(長期)生活中都會發胖,但是在這個胖胖的時候,我現在無法得到它。換句話說,在當前的'parent.c'實現中沒有長時間運行的孩子的輸出。 –