私は与えられたディレクトリ内のすべてのファイルを使って何かをする必要がある割り当てが与えられています。遭遇した各ディレクトリに対して、私たちはプログラムの別のインスタンスをforkすることになっています。 、一度親プロセスによって(私の最初のアプローチはopendir()
とreaddir()
使用していますが、私は、readdir()
がディレクトリに(だけではなく、トップレベルの項目を)すべてエントリを列挙するように、いくつかのエントリが処理されます複数回を見つけましたファイルが "root"になるまで子プロセスごとに1回)。私は.
に私のプログラムを起動した場合Unix C++のフォルダのルートにあるファイルとディレクトリを一覧表示
.
├── 1.txt
├── a
│ ├── 2.txt
│ ├── 3.txt
│ └── c
│ └── 4.txt
└── b
└── 5.txt
が、それは1.txt
処理し、a
とb
ための2つの子プロセス、1それぞれを作成し、それらのプロセスが終了するのを待ちます。たとえば、次のファイルシステムツリーを与えられました。
最初の子プロセスは2.txt
と3.txt
で動作し、c
の別の子プロセスを作成します。
第三子プロセスが簡単に言えば5.txt
上で動作します:私は私の最初のアプローチを使用し続けることができるか、ディレクトリ
の唯一のレベルを読み取ること見当もつかないが、私はそれのように感じます本当に私が現在調べている直接のフォルダにないものはすべて無視するのは非効率的です。
EDIT 1:コード例:だから
int process(std::string binpath, std::string src)
{
DIR* root = nullptr;
root = opendir(source.c_str());
if(root == nullptr)
{
return -1;
}
struct dirent* details;
struct stat file;
std::string path;
std::queue<int> childPids;
bool error = false;
while((details = readdir(root)) != nullptr)
{
path = source + details->d_name;
lstat(path.c_str(), &file);
if(IsDirectory(file.st_mode))
{
if(strcmp(details->d_name, ".") == 0 || strcmp(details->d_name, "..") == 0)
{
continue;
}
// Fork and spawn new process and remember child pid
auto pid = fork();
if(pid == 0)
{
char* args[] = {
(char*) "-q",
(char*)"-s", const_cast<char*>(path.c_str()),
NULL
};
char* env[] = {NULL};
execve(binpath.c_str(), args, env);
}
else
{
childPids.push(pid);
}
}
else
{
if(!DoWorkOnFile(path)) error = true;
}
}
//Wait all child pids
while(!childPids.empty())
{
auto pid = childPids.front();
int status;
if(waitpid(pid, &status, 0) == pid)
{
if(status != 0) error = true;
}
else
{
error = true;
}
childPids.pop();
}
closedir(root);
return error ? -1 : 0;
}
コードを掲載することはできますか? 'readdir'はあなたが開いたディレクトリのエントリだけを読み込み、サブディレクトリのエントリは読み込みません。たとえば、ダイアグラムで '.'を開くと' read'は '.'、' ..'、 '1.txt'、' a'、 'b'を返します。 –