c - 这是在 linux 编程中并发处理文件的有效方法吗?

标签 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 程序将读取每一行,然后使用低级打开系统调用打开该特定文件。现在我将 fork 一个进程,在子进程中,我将在该特定文件描述符上执行任务(在我们的示例中为 anotherProgram),而父进程返回并打开第二个文件(在第二行)并再次 fork ,依此类推等等。 (见问题 2)

这个另一个程序将以文件描述符作为参数执行。这样在我的 exec'd child 中,我仍然可以使用相同的文件描述符来引用相同的文件,即使在 fork 之后也是如此吗?因此并发处理?这anotherProgram可能只是从文件描述符等中读取的内容。

既然我已经说了这么多,我有几个问题。

  1. 这是并发处理文件的有效方式吗?我不想要线程,但我想以某种方式使用 fork 来执行此操作。

  2. 此外,由于我在父级循环中运行 fork,每个新的子级都会继承以前的文件描述符,例如,第一个子级将继承“3”,第二个子级将继承“3”和“4”第三个 child 将继承“3”、“4”和“5”文件描述符。那么有没有办法避免这种情况,让 child “i”只继承“ith”文件描述符?

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

最佳答案

I have a list of files and a program which I want to apply to all of them concurrently using fork, dup, exec or piping, without any threads. How do I do this?

您的概述设计可以工作,但如果父级在将文件描述符传递给子级后不需要对文件描述符执行任何其他操作,则可以进行改进。在这种情况下,父级可以关闭该文件,以便下一个打开的文件可以使用相同的描述符,并且没有用完描述符的危险。此外,可以使用众所周知的描述符,因此无需将其传递给子任务。例如:

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

关于c - 这是在 linux 编程中并发处理文件的有效方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40901335/

相关文章:

regex - perl 一行+正则表达式匹配部分单词

C 警告 : Function returns address of local variable

c - C 编程中的结构

c++ - linux kernel.h 文件中定义的宏

linux - 向 Linux 中的多个进程发送数据

unix - 如何将 find 命令返回的文件列表通过管道传递给 cat 以查看所有文件

c - vxworks设置串口波特率失败

linux - AH02429 : Response header name 'record Created - ' contains invalid characters, 中止请求

c - 将 awk 输出通过管道传输到 C 程序中

perl - Perl 中的系统和反引号和管道之间有什么区别?