簡體   English   中英

這是在linux編程中同時處理文件的有效方法嗎?

[英]Is this an efficient way to concurrently process files in linux programming?

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

/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程序將讀取每一行,然后使用低級開放系統調用打開該特定文件。 現在我將在一個進程的fork中,在子進程中,我將在該特定文件描述符上執行任務(在我們的示例中為anotherProgram ),而父進程返回並打開第二個文件(在第二行)並再次分叉,依此類推向前。 (見問題2)

這個anotherProgram將以文件描述符作為參數執行。 這樣在我的exec'd孩子中,即使分叉后,我仍然可以使用相同的文件描述符來引用同一個文件嗎? 因此並行處理? 這個anotherProgram可能只是從文件描述符等讀取。

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

  1. 這是同時處理文件的有效方法嗎? 我不想要線程,但我想使用fork來做到這一點。

  2. 此外,由於我在父級循環中運行fork,每個新子級都繼承以前的文件描述符,例如,第一個子級將繼承“3”,第二個子級將繼承“3”和“4”,第三個子級將繼承'3','4'和'5'文件描述符。 那么有沒有辦法避免這種情況,以便孩子'我'只繼承'ith'文件描述符?

TLDR; 我有一個文件列表和一個程序,我想使用fork,dup,exec或piping同時應用於所有這些文件和程序,沒有任何線程。 我該怎么做呢?

我有一個文件列表和一個程序,我想使用fork,dup,exec或piping同時應用於所有這些文件和程序,沒有任何線程。 我該怎么做呢?

您概述的設計將起作用,但如果父項在將文件描述符傳遞給子項后不需要對文件描述符執行任何其他操作,則可以進行改進。 在這種情況下,父級可以關閉文件,以便下一個打開的文件可以使用相同的描述符,並且沒有使用描述符的危險。 此外,可以使用眾所周知的描述符,因此不需要將其傳遞給子任務。 E. g。:

#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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM