使用带有参数c的exec

问题描述 投票:0回答:1

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

现在我尝试使用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);
}
c exec
1个回答
0
投票

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

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

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

但是这不适用于execl,因此不必为了强制使用相对路径而包含/

如果确实需要指定特定目录(例如/usr/share/lib/myapp),则需要串联一个文件路径。在这种情况下,如果您不能使用strcat(或不想使用它),则必须编写自己的串联函数。 %s扩展名不是语言语法。它是printf和相关库函数的一部分。 (这些相关函数之一是snprintf,与重复调用strcat相比,这通常是一种在运行时创建字符串的更安全,更方便的方法。但是,如果您无法使用strcatsnprintf是。)

© www.soinside.com 2019 - 2024. All rights reserved.