C-这是同时处理Linux编程中文件的有效方法



我想同时处理不同的文件。我的程序将获得第一个参数,该参数是一个文件,其中包含我的PC上不同文件的名称(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程序将读取每一行,然后使用低级打开系统调用打开该特定文件。现在,我将分支一个过程,在孩子中,我将在该特定文件描述符上执行任务(anotherProgram),而父母则返回并打开第二个文件(在第二行),然后再次叉,等等向前。(请参阅问题2)

此另一个程序将以文件描述符作为参数执行。这样,在我的执行孩子中,即使在叉作后,我仍然可以使用相同的文件描述符来引用同一文件吗?因此同时流程?此anotherProgram可能只是从文件描述符等读取的内容。

所以现在我已经说了这一切,我有几个问题。

  1. 这是同时处理文件的有效方法吗?我不想要线程,但是我想在某种程度上使用叉子。

  2. 同样,由于我在父母的循环中运行叉子,因此每个新孩子都继承了以前的文件描述符,例如,第一个孩子将继承" 3",第二个孩子将继承" 3"one_answers" 4"第三个孩子将继承" 3"," 4"one_answers" 5"文件描述符。因此,有没有办法避免这种情况,以便孩子"我"仅继承'ith'文件描述符?

tldr;我有一个文件列表和一个程序,我想使用叉,dup,exec或piping同时将其应用于所有文件,而无需任何线程。我该怎么做呢?

我有一个文件列表和一个我要应用于所有的程序 它们同时使用叉,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 = '';
        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;
    }
}

最新更新