名为 connect() 的函数如何阻止 MPI C 程序运行 运行?

How does function named connect() prevent MPI C program from running?

我正在为并行编程课程编写一个使用 MPI 的项目,并决定命名我的一个函数 connect()。但是每当我尝试 mpirun 程序(在 Linux 和 OS X 上使用最新版本的 Open MPI)时,我都会收到 connect() 函数的输出,即使我没有从 main() 打电话给 connect();此外,main() 的一些输出不会出现。

这是一个简化的程序,存在以下问题:

#include <stdlib.h>
#include <stdio.h>
#include <mpi.h>

void connect(); //function name breaks mpi

int main(void) {

    int comm_sz, my_rank;
    MPI_Init(NULL, NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    printf("my_rank is %d\n", my_rank);
    fflush(stdout);
    MPI_Finalize();
    return EXIT_SUCCESS;
}

void connect() {

    printf("\nNot main! \n");
    return;
}

和输出:

[me@host ~]$ mpicc bad.c -Wall
[me@host ~]$ mpirun -n 1 a.out 

Not main! 
--------------------------------------------------------------------------
orterun noticed that process rank 0 with PID 17245 on node host exited on signal 13 (Broken pipe).
--------------------------------------------------------------------------

一开始我正要在 Stack Overflow 上问问题出在哪里,直到我发现重命名函数可以解决问题。所以我现在很好奇的是,为什么将函数命名为 connect() 会阻止程序正确地 运行ning。 mpirun/Open RTE 也有问题吗?

可能的线索:

mac:~ me$ ./a.out 
my_rank is 0

[me@linux ~]$ ./a.out 

Not main! 

我猜你调用的 MPI 函数之一反过来调用了 connect() 系统调用。但是由于 ELF 可执行文件有一个用于符号的平面命名空间,所以你的 connect() 被调用了。

在Mac OS上没有出现这个问题,因为Mach-O库有一个两级命名空间,所以不同库中的符号不​​会相互冲突。

如果您将函数设置为静态的,那么也可能会避免该问题。