c - 用于 MPI_FILE_OPEN 的 MPI 感知 mkstemp(3)?

标签 c mpi mkstemp

我想在 MPI 应用程序中生成一个唯一的文件名。

阅读 MPI_FILE_OPEN 下的“给实现者的建议”在规范的 2.2 版中表明文件名类似于 uriPrefix:foo/bar/baz除了通常的foo/bar/baz是可能的。像 baz/PASSWORD=SECRET 这样的文件名也是如此. MPI 实现有望使用这些附加信息做正确的事情。

这些额外的文件名元素将对 mkstemp(3) 造成严重破坏.在前一种情况下,uriPrefix可能指示文件应存放在何处。在后一种情况下,bazXXXXXX/PASSWORD=SECRET会搞砸mkstemp(3)的模板约定。

有没有人对如何安全结合 mkstemp(3) 有建议?与 MPI_FILE_OPEN

最佳答案

MPI_FILE_OPEN 是一个集体操作。它旨在由具有相同文件名的所有 MPI 等级调用,并且该名称还应指向共享文件系统上的一个位置。否则就没有意义。如果在不同级别调用,mkstemp(3) 会生成不同的名称。它还创建文件并返回其文件描述符。如果您想使用 MPI 并行 IO,可能不是您想要的。

如果你真的想创建一个独特的文件,那么你可能会这样做:

int rank;
char name[PATH_MAX] = "/path/to/shared/directory/prefixXXXXXX";
MPI_File fh;

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

// Create the temporary file in rank 0 only
if (rank == 0)
{
   int fd = mkstemp(name);
   // Close the handle - we don't need it
   close(fd);
   // <----- Decorate name here
}
// Broadcast the file name to all other ranks
MPI_Bcast(name, PATH_MAX, MPI_CHAR, 0, MPI_COMM_WORLD);

// Now open the file for MPI parallel IO
MPI_File_open(MPI_COMM_WORLD, name, MPI_MODE_RDWR, MPI_INFO_NULL, &fh);

mkstemp(3) 中获得名称后,在标记为 Decorate name here 的位置,您可以对名称进行额外的装饰,例如将 /PASSWORD=SECRET 附加到它或在它前面加上 fstype:。也可以在广播后进行,如果需要放一些进程特定的装饰。

关于c - 用于 MPI_FILE_OPEN 的 MPI 感知 mkstemp(3)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166972/

相关文章:

c - 如果输出缓冲区有数据,调用 bufferevent_free 后会做什么?

用于读取字符的 C 程序无法识别正确输入的字符串。

c - mkstemp 函数的隐式声明

c - 如何从文件描述符获取 FILE 指针?

python - 使用python并行输入

c++ - win32 的 mkstemp() 实现

无法弄清楚 C 语言中 scanf ("%[^\n]\n", input) 会发生什么

c - 尝试使用 const 初始化变量时出现错误 "initializer element is not constant"

c - 使用带有 ISend 和 IRecv 的三个线程使用 MPI 发送消息

arrays - 输出3D数组的算法