这是在linux编程中同时处理文件的有效方法吗?

时间:2016-12-01 01:50:28

标签: c linux pipe fork exec

我想同时处理不同的文件。我的程序将得到第一个参数,它是一个文件,其中包含我的电脑上不同文件的名称(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将以文件描述符作为参数执行。这样在我的exec小孩中,即使分叉后,我仍然可以使用相同的文件描述符来引用同一个文件吗?因此并行处理?这个anotherProgram可能只是从文件描述符等中读取。

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

  1. 这是同时处理文件的有效方法吗?我不想要线程,但我想用叉子来做这件事。

  2. 此外,由于我在父项循环中运行fork,因此每个新子项都继承了以前的文件描述符,例如,第一个孩子将继承' 3'而第二个孩子将继承' 3'和' 4'并且第三个孩子将继承“3'”,' 4'和' 5'文件描述符。那么有没有办法避免这种情况,以便孩子“我能够”这样做。仅仅继承了' ith'文件描述符?

  3. TLDR;我有一个文件列表和一个程序,我想使用fork,dup,exec或piping同时应用于所有这些文件和程序,没有任何线程。我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

  

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