2016-12-01 31 views
0

我想同時處理不同的文件。我的程序將得到第一個參數,它是一個文件,其中包含我的電腦上不同文件的名稱(absolute paths),第二個參數是要運行的程序的名稱(現在稱爲anotherProgram)。所以,一個這樣的文件可能是這樣的這是一種在linux編程中同時處理文件的有效方法嗎?

/usr/home/username/Desktop/folder/file.txt 
/usr/home/username/Desktop/file2.txt 
/usr/home/username/Desktop/folder/directory/anotherfile.txt 
/usr/home/username/Desktop/folder/file3.txt 
/usr/home/username/Documents/folder/file5.txt 
/usr/home/username/Desktop/file10.txt 
/usr/home/username/Desktop/folder/file9.txt 

現在我的C程序將讀取每一行,然後使用低空開放系統調用打開該文件。現在我將分叉一個進程,在子進程中,我將執行該特定文件描述符中的任務(在我們的示例中爲anotherProgram),而父進程返回並打開第二個文件(在第二行)並再次分叉,等等向前。 (請參閱問題2)

這個anotherProgram將以文件描述符作爲參數執行。通過這種方式,在我的可執行子中,即使在分叉之後,我仍然可以使用相同的文件描述符來引用同一個文件?並因此同時處理?這anotherProgram可能是剛剛從文件描述符中讀取的東西等。

所以現在我已經說了這一切,我有幾個問題。

  1. 這是一種同時處理文件的有效方法嗎?我不想要線程,但我想用fork來做到這一點。另外,因爲我在父項循環中運行fork,所以每個新的子項都會繼承先前的文件描述符,例如,第一個子項將繼承「3」,第二個子項將繼承「3」和「4」,然後第三個孩子會繼承'3','4'和'5'文件描述符。那麼有沒有辦法避免這種情況,以便孩子'我'只繼承'ith'文件描述符?

TLDR;我有一份文件和一個程序的列表,我想同時使用fork,dup,exec或piping來同時應用它們,而沒有任何線程。我該怎麼做呢?

+0

我也是那個「我們」的一部分。除此之外,你是否曾經想過我正在做這個分析和基準測試?我只想了解系統調用的用法。 – posixKing

+3

當你簡單地使用'xargs'(或GNU'parallel')時,看起來你會寫一個'xargs'(或GNU'parallel')的簡單版本。 –

回答

0

我有一個文件列表和計劃,我要適用於所有的他們同時使用叉子,DUP,高管或管道 ,沒有任何 線程。我該怎麼做呢?

您的概述設計可以正常工作,但如果在將父對象傳遞給子對象後不需要使用文件描述符執行其他操作,則可以進行改進。在這種情況下,父級可以關閉該文件,以便下一個打開的文件可以使用相同的描述符,並且沒有使用描述符的危險。而且,可以使用衆所周知的描述符,因此不需要將它傳遞給子任務。例如:

#include <stdio.h> 
#include <string.h> 
#include <limits.h> 

main(int argc, char *argv[]) 
{ 
    if (argc != 3) 
     return printf("usage: %s 'namesFile' 'anotherProgram'\n", *argv), 1; 
    FILE *names = fopen(argv[1], "r"); 
    if (!names) return perror(argv[1]), 1; 
    char path[PATH_MAX]; 
    while (fgets(path, sizeof path, names)) 
    { 
     char *np = strchr(path, '\n'); 
     if (np) *np = '\0'; 
     FILE *input = freopen(path, "r", stdin); // reuse well-known 'stdin' 
     if (!input) { perror(path); continue; } 
     if (fork()) return execvp(argv[2], argv+2), perror(argv[2]), 1; 
    } 
} 
相關問題