如何獲得由 exec() 運行的程式的輸出。假設我有這個代碼:
int main(int argc, char ** argv) {
int fid = fork();
if(fid == 0) {
execlp("ls", "ls", NULL);
}
wait();
return 0;
}
父行程如何獲取ls命令的輸出?
uj5u.com熱心網友回復:
該exec系列函式完全替換當前的行程。但是,它們不會關閉檔案描述符,除非它們標記為 close-on-exec。因此,執行此操作的典型方法是創建一個管道,其中讀取端屬于父級,寫入端屬于子級。
這看起來像這樣(省略了錯誤檢查并且顯然效率低下):
#include <stdint.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char ** argv) {
int pipefd[2];
int status;
uint8_t buf[256];
pipe(pipefd);
int fid = fork();
if(fid == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
close(pipefd[1]);
execlp("ls", "ls", NULL);
}
close(pipefd[1]);
while (read(pipefd[0], buf, 1) > 0)
write(1, buf, 1);
wait(&status);
return 0;
}
請注意,要將管道檔案描述符附加到標準輸出 (FD 1),您需要使用dup2. 您還需要關閉不使用的管道的末端,否則您可能永遠無法到達檔案末尾。
如果您對退出狀態感興趣,wait(或waitpid)將為您提供;請參閱手冊頁以了解如何確定它是否正常退出,如果是,該狀態是什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/348967.html
上一篇:使用`sed`查找重復模式
