这个问题是解决以下讨论的问题后的下一步:
我使用管道通过标准输入将字符串传递给名为 GULP 的外部程序,并接收 GULP 的标准输出作为我的程序的输入。这在一个处理器上运行良好,但在两个或更多处理器上存在问题(假设它只有 2 个内核)。程序 GULP 使用一个临时文件,似乎两个处理器同时启动 GULP,然后 GULP 尝试同时对同一个文件执行多个操作(可能是同时写入)。GULP 报告“错误打开文件”。
我正在运行 Ubuntu 的多核笔记本电脑上测试此代码,但该代码适用于分布式内存 HPC(我使用的是 OpenMPI)。为了这个讨论,假设我不能修改 GULP。
我希望有一些简单的方法可以让 GULP 创建两个独立的临时文件并继续正常运行。我要求太多了吗?
希望这个伪代码会有所帮助(假设有 2 个处理器):
int main()
{
MPI_Init(&argc,&argv);
MPI_Comm_rank(…);
MPI_Comm_size(…);
int loopmin, loopmax;//distributes the loop among each processor
for (int i = loopmin; i < loopmax; i++)
{
Launch_GULP(…);//launches external program
}
return 0;
}
Launch_GULP(…)
{
int fd_p2c[2], fd_c2p[2];
pipe(fd_p2c);
pipe(fd_c2p);
childpid = fork();
//the rest follows as in accepted answer in above link
//so i'll highlight the interesting stuff
if (childpid < 0)
{
perror("bad");
exit(-1);
}
else if (childpid == 0)
{
//call dup2, etc
execl( …call the program… );
}
else
{
//the interesting stuff
close(fd_p2c[0]);
close(fd_c2p[1]);
write(fd_p2c[1],…);
close(fd_p2c[1]);
while(1)
{
bytes_read = read(fd_c2p[0],…);//read GULP output
if (bytes_read <= 0)
break;
//pass info to read buffer & append null terminator
}
close(fd_c2p[0]);
if(kill(childpid,SIGTERM) != 0)
{
perror("Failed to kill child… tragic");
exit(1);
}
waitpid(childpid, NULL, 0);
}
//end piping… GULP has reported an error via stdout
//that error is stored in the buffer string
//consequently an error is triggered in my code and the program exits
}