gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:32 27 4
gpt4 key购买 nike

我想同时处理不同的文件。我的程序将获得第一个参数,它是一个包含我电脑上不同文件的名称(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com