第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將exec輸出重定向到緩沖區(qū)或文件

將exec輸出重定向到緩沖區(qū)或文件

C
慕田峪7331174 2019-10-25 15:38:28
我正在寫一個C程序中我fork(),exec()和wait()。我想將執(zhí)行的程序的輸出寫入文件或緩沖區(qū)。例如,如果我執(zhí)行,ls 我想寫入file1 file2 etc緩沖區(qū)/文件。我認(rèn)為沒有辦法讀取stdout,這是否意味著我必須使用管道?這里有我找不到的一般程序嗎?
查看完整描述

3 回答

?
躍然一笑

TA貢獻(xiàn)1826條經(jīng)驗 獲得超6個贊

為了將輸出發(fā)送到另一個文件(我省去了錯誤檢查,將重點放在重要的細(xì)節(jié)上):


if (fork() == 0)

{

    // child

    int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);


    dup2(fd, 1);   // make stdout go to file

    dup2(fd, 2);   // make stderr go to file - you may choose to not do this

                   // or perhaps send stderr to another file


    close(fd);     // fd no longer needed - the dup'ed handles are sufficient


    exec(...);

}

要將輸出發(fā)送到管道,以便隨后將輸出讀入緩沖區(qū):


int pipefd[2];

pipe(pipefd);


if (fork() == 0)

{

    close(pipefd[0]);    // close reading end in the child


    dup2(pipefd[1], 1);  // send stdout to the pipe

    dup2(pipefd[1], 2);  // send stderr to the pipe


    close(pipefd[1]);    // this descriptor is no longer needed


    exec(...);

}

else

{

    // parent


    char buffer[1024];


    close(pipefd[1]);  // close the write end of the pipe in the parent


    while (read(pipefd[0], buffer, sizeof(buffer)) != 0)

    {

    }

}


查看完整回答
反對 回復(fù) 2019-10-25
?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗 獲得超11個贊

您需要準(zhǔn)確地決定要做什么-最好對其進(jìn)行更清晰的說明。

選項1:文件

如果知道要將執(zhí)行的命令的輸出轉(zhuǎn)到哪個文件,則:

  1. 確保父母和孩子在姓名上達(dá)成一致(父母在分叉之前確定姓名)。

  2. 父叉-您有兩個過程。

  3. 子級重新組織事物,以便文件描述符1(標(biāo)準(zhǔn)輸出)進(jìn)入文件。

  4. 通常,您可以不理會標(biāo)準(zhǔn)錯誤;您可以從/ dev / null重定向標(biāo)準(zhǔn)輸入。

  5. 然后孩子執(zhí)行相關(guān)命令;該命令運行,所有標(biāo)準(zhǔn)輸出到達(dá)文件(這是基本的Shell I / O重定向)。

  6. 然后執(zhí)行的過程終止。

  7. 同時,父流程可以采用以下兩種主要策略之一:

    • 打開文件進(jìn)行讀取,并繼續(xù)讀取直到到達(dá)EOF。然后,它需要仔細(xì)檢查孩子是否死亡(因此不再需要讀取任何數(shù)據(jù)),或者閑逛以等待孩子的更多輸入。

    • 等待孩子死亡,然后打開文件進(jìn)行閱讀。

    • 第一個優(yōu)點是父母可以在孩子還奔跑的同時做一些工作。第二個優(yōu)點是您不必迷惑I / O系統(tǒng)(重復(fù)讀取過去的EOF)。

選項2:管道

如果希望父級從子級讀取輸出,請安排子級將其輸出通過管道返回給父級。

  1. 使用popen()可以很容易地做到這一點。它將運行該進(jìn)程并將輸出發(fā)送到您的父進(jìn)程。請注意,在子級生成輸出時,父級必須處于活動狀態(tài),因為管道的緩沖區(qū)大小較?。ㄍǔ?-5 KB),并且如果子級生成的數(shù)據(jù)多于父級不讀取時的數(shù)據(jù),則子級將阻塞直到父母讀。如果父母正在等待孩子的死亡,那么您將陷入僵局。

  2. 使用pipe()等很難做到這一點。父級調(diào)用pipe(),然后進(jìn)行派生。子進(jìn)程對管道進(jìn)行分類,以使管道的寫端成為其標(biāo)準(zhǔn)輸出,并確保關(guān)閉與管道有關(guān)的所有其他文件描述符。這很可能使用dup2()系統(tǒng)調(diào)用。然后,它執(zhí)行所需的過程,該過程將其標(biāo)準(zhǔn)輸出發(fā)送到管道。

  3. 同時,父級還會關(guān)閉管道的多余末端,然后開始閱讀。當(dāng)它在管道上發(fā)生EOF時,它知道孩子已經(jīng)完成并關(guān)閉了管道。它也可以關(guān)閉管道的末端。


查看完整回答
反對 回復(fù) 2019-10-25
  • 3 回答
  • 0 關(guān)注
  • 793 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號