首页 > 解决方案 > 使用带参数 c 的 exec

问题描述

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

现在我尝试使用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);
}

标签: cexec

解决方案


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

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

由于您使用的 shell 复制了 的功能execlp,因此您不能仅通过指定文件名来在当前工作目录中运行可执行文件。您必须写./omer而不是omer. (当然,除非您添加.到您的.PATH./omerPATH

但这不适用于execl,因此没有必要包含 a/来强制将其用作相对路径。

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


推荐阅读