使用带有参数 c 的 exec

useing exec with parameters c

我制作了一个获取目录路径的程序,编译该目录文件夹中的文件并执行它们。

现在我尝试使用 execl 但我真的不知道在我 运行 程序之前执行的文件的名称。

因为文件的名称是它所在的文件夹的名称。 (例如,我有 .../omer/omer.c 并将其编译为 omer) 现在,当我执行时,我想做类似的事情以使其正常工作:

execl("./omer","./omer",NULL);

我尝试这样做的方式是(我有文件名):

execl("./%s",fileName,"./%s",fileName);

但这没有任何作用。现在的问题是我不能使用 strcat() 所以我试图避免创建一个函数来创建一个开头有“./”的字符串..

有什么方法可以在不使用 strcat() 之类的东西的情况下完成我尝试过的事情,或者没有办法避免它 (基本上我想将自定义字符串插入 execl)?

感谢您的帮助!

编辑: 根据要求添加更多代码:

cFilePath = 
readStudentcFilePath(confContent[0],studentName,strLeng(confContent[0]));
pid = fork();
if(pid<0)
{
  fprintf(stderr, "Forking Error!\n");
  exit(FORK_ERR);
}
if(pid == 0)
{
  execl("/usr/bin/gcc","gcc",cFilePath,"-o",studentName,NULL);
  fprintf(stderr, "Failed to Execute file 'gcc' \n");
  exit(EXEC_ERR);
}
pid = fork();
if(pid<0)
{
  fprintf(stderr, "Forking Error!\n");
  exit(FORK_ERR);
}
if(pid == 0)
{
  studentOutFd = open("test_output.txt",O_WRONLY|O_TRUNC|O_CREAT);
  if(studentOutFd < 0 )
  {
    fprintf(stderr, "Error Opening File 'test_output.txt'\n");
    exit(FILE_OPEN_ERR);
  }
  dup2(STDIN_FILENO,inFd);
  dup2(STDOUT_FILENO,studentOutFd);
  execl("./%s",studentName,"./%s",studentName,NULL);
  fprintf(stderr, "Error Executing File %s\n", studentName);
  exit(EXEC_ERR);
}

如果您使用 execl(或任何没有 [=13= 的 exec 变体,则无需在文件名前加上 "./" ] 在其名称中)。 exec 的所有这些版本都以通常的方式将它们的第一个参数解释为路径名;也就是说,如果它以 / 开头,则作为绝对路径,否则作为相对于当前工作目录的路径。

exec 名称中确实包含 p 的变体(execlpexecvp 等)如果第一个参数不包含,则对其第一个参数的解释不同一个/。在这种情况下,将在 PATH 环境变量(或特定于库的默认值,通常为 /usr:/usr/bin)中列出的目录中搜索路径名。由于.通常不包含在PATH中,因此不会在当前工作目录中搜索文件名。

由于您使用的 shell 重复了 execlp 的功能,您不能 运行 在当前工作目录中仅通过指定文件名来执行可执行文件。您必须写 ./omer 而不是 omer。 (当然,除非您将 . 添加到 PATH。出于安全原因,不建议这样做。)由于 ./omer 包含斜杠,因此不会导致 PATH 搜索.

但这不适用于 execl,因此没有必要包含 / 以强制使用相对路径。

如果您确实觉得需要指定特定目录(例如 /usr/share/lib/myapp),那么您需要连接一个文件路径。在那种情况下,如果您不能使用 strcat(或不想使用它),那么您将不得不编写自己的连接函数。 %s 扩展不是语言语法。它是 printf 和相关库函数的一部分。 (其中一个相关函数是 snprintf,与重复调用 strcat 相比,它通常是一种在 运行 时创建字符串的更安全、更方便的方法。但是,如果 strcat 对您不可用,snprintf 似乎不太可能。)