C:在unix/linux上,与access()或execl()中的模式匹配的自动完成文件名

C:在unix/linux上,与access()或execl()中的模式匹配的自动完成文件名,c,linux,unix,gcc,system-calls,C,Linux,Unix,Gcc,System Calls,我有一个程序masterprog,它在多个这样的文件slaveprog.1.1.0、slaveprog.1.2.1、slaveprog.2.1.10……中执行一个二进制匹配特定模式。。。在同一目录中 更清楚地说,我的masterprog会检查系统中的环境(在本例中为Ubuntu 16.04 LTS amd64),并查找其他一些因素,然后决定执行哪个slaveprog.X.Y.Z。我的slaveprog命名约定如下: X:1=debian | 2=rpm Y:1=amd64 | 2=x86 Z:最

我有一个程序masterprog,它在多个这样的文件slaveprog.1.1.0、slaveprog.1.2.1、slaveprog.2.1.10……中执行一个二进制匹配特定模式。。。在同一目录中

更清楚地说,我的masterprog会检查系统中的环境(在本例中为Ubuntu 16.04 LTS amd64),并查找其他一些因素,然后决定执行哪个slaveprog.X.Y.Z。我的slaveprog命名约定如下:

X:1=debian | 2=rpm Y:1=amd64 | 2=x86 Z:最新slaveprog版本 我的主程序能够生成slaveprog.1.1。来自环境和电话:

access("./slaveprog.1.1.*",F_OK); // To verify if file exists
execl("/slaveprog.1.1.*","/slaveprog.1.1.*",NULL);
但不幸的是,即使当前工作目录中存在slaveprog.1.1.3,access也会返回-1


有谁能告诉我,有没有比打开目录、列出所有文件并选择适当的文件更简单的方法来实现这一点?

使用通配符或通配符(如它所称)是由shell而不是系统调用完成的。你需要自己做环球飞行。为此,您可以使用,例如,您可能需要glob.*是用于glob模式匹配的元字符。shell(例如bash)在处理命令行时使用此命令。这不正确,但尝试访问一个找不到的文件。/slaveprog.1.1.*。另一种可能的解决方案是从零循环到某个最大版本号,并调用access,直到失败。然后您就知道哪个版本号最高。请注意,您在exec调用中错误地键入了./slaveprog as/slaveprog,并且NULL应该是char*NULL,这样才能与定义NULL 0的系统兼容。使用通配符或它所称的globbing是由shell而不是系统调用完成的。你需要自己做环球飞行。为此,您可以使用,例如,您可能需要glob.*是用于glob模式匹配的元字符。shell(例如bash)在处理命令行时使用此命令。这不正确,但尝试访问一个找不到的文件。/slaveprog.1.1.*。另一种可能的解决方案是从零循环到某个最大版本号,并调用access,直到失败。然后您知道哪个版本号最高。请注意,您在exec调用中错误地键入了/slaveprog as/slaveprog,并且NULL应该是char*NULL,以便与定义NULL 0的系统兼容。