【问题标题】:How do I run an executable in a different directory in C?如何在 C 的不同目录中运行可执行文件?
【发布时间】:2014-06-28 00:34:11
【问题描述】:

我想在 C 脚本中运行 ../folder1/folder2 中的可执行文件。现在我正在尝试做:

char command[50];
strcpy(command, "cd ../folder1/folder2");
system(command);
memset(command,0,sizeof(command));
strcpy(command, "./executable_name");
system(command);

但它不起作用。我应该使用 chdir(),还是有其他方法可以做到这一点?有可能吗?

【问题讨论】:

  • 工作不strcpy(command, "../folder1/folder2/executable_name"); system(command);
  • 可能你没有访问某些文件夹
  • C 不是脚本语言;说“在 C 脚本中”听起来很奇怪。
  • 此外,system() 会生成一个子shell 来执行您的命令,因此您的cd 将仅适用于该子shell,该子shell 在为您的第二个命令创建新子shell 之前退出。

标签: c executable


【解决方案1】:

它不起作用,因为当你执行时:

system("cd ../folder1/folder2");

它对可执行文件的当前目录没有影响。因此,当您执行时:

system("./executable_name");

它没有找到它。

您可以使用以下任何一种方法来解决它:

  1. 把给定的命令改成system

    system("../folder1/folder2/executable_name");
    
  2. 把给定的命令改成system

    如果您的默认 shell 是 bash 和许多 UNIX shell,这将起作用。

    system("cd ../folder1/folder2; ./executable_name");
    
  3. 创建一个包含以下内容的 shell 脚本:

    #/bin/bash
    cd  ../folder1/folder2
    ./executable_name
    

    然后使用system从C运行shell脚本

    system("myscript.sh");
    
  4. 在调用 system 之前,在 C 中向 chdir 添加一行:

    chdir("../folder1/folder2");
    system("./executable_name");
    

更新,感谢@Jongware

以上所有内容都假设您的程序在../folder1/folder2 是有效路径的目录中执行。如果您的程序是从不同的目录执行的,并且您想考虑这种情况,则必须解析 argv[0] 并调整处理调用的方式以执行 executable_name

【讨论】:

  • 我让它与 chdir 一起工作。感谢您解释系统的实际工作原理。
  • .. 但请注意,这仍然取决于您的可执行文件从其自己的文件夹开始。可以在另一个文件夹中启动可执行文件,然后找不到您的(相对!)路径。
  • @Jongware,好点子。您介意我将其添加到答案中吗?
  • 当然,继续。 (解析argv[0]是一个可靠的解决方案吗?之前可能已经在SO上讨论过了。)
【解决方案2】:

最简单的方法通常是:

system("../folder1/folder2/executable_name");

否则,您必须在程序中通过chdir() 执行cd,或者安排执行cd 并在单个shell 中执行命令(单次调用system()),如:

system("cd ../folder1/folder2; ./executable_name");

【讨论】:

    【解决方案3】:

    问题是系统,做一个fork,在一个子进程中执行cd,它结束并且不影响程序进程的工作目录。 Shells,需要内置 cd & dirs 才能生效。

    您可以使用getwdchdir 更改目录,然后使用"." 更改目录,而不是使用shell 命令,添加"cd ../folder1/folder2; ./executable_name",使用fork 并更改目录并运行命令在exec 自己的孩子中,或者只是使用相对路径“../folder1/folder2/executable_name”运行程序。

    #include <unistd.h>
    
    int chdir(const char *path);
    char *getcwd(char *buf, size_t size);
    

    【讨论】:

      【解决方案4】:

      您需要执行一个脚本来更改目录然后运行应用程序。

      【讨论】:

        【解决方案5】:

        您可以简单地使用相对或绝对路径执行程序。如果您确实想在另一个工作目录中执行它,请继续阅读。

        目前您的程序在执行子程序之前不会更改其工作目录。

        简单解释,system 启动一个新程序,该程序更改其工作目录然后退出,因此您的程序不受影响

        您尝试的内容在实际脚本中有效,因为解释器不会为您给它的每个命令生成一个新的 shell,而是自己执行它们。

        使用chdir() 或其他一些API 来更改当前执行程序的目录

        【讨论】:

          猜你喜欢
          • 2019-08-13
          • 1970-01-01
          • 2016-12-16
          • 1970-01-01
          • 1970-01-01
          • 2019-06-08
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          相关资源
          最近更新 更多