c - 使用带参数 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);
}
解决方案
"./"
如果您正在使用execl
(或任何名称exec
中没有 a 的变体),则无需在文件p
名前添加。所有这些版本都exec
以通常的方式将它们的第一个参数解释为路径名;也就是说,如果它以 a 开头,则作为绝对路径,否则/
作为相对于当前工作目录的路径。
名称中有 a的exec
变体p
(execlp
,execvp
等)如果不包含 a ,则对其第一个参数的解释不同/
。PATH
在这种情况下,将在环境变量(或特定于库的默认值,通常为)中列出的目录中搜索路径名/usr:/usr/bin
。由于.
通常不包含在 中PATH
,因此不会在当前工作目录中搜索文件名。
由于您使用的 shell 复制了 的功能execlp
,因此您不能仅通过指定文件名来在当前工作目录中运行可执行文件。您必须写./omer
而不是omer
. (当然,除非您添加.
到您的.PATH
./omer
PATH
但这不适用于execl
,因此没有必要包含 a/
来强制将其用作相对路径。
如果您确实觉得需要指定一个特定目录(例如/usr/share/lib/myapp
),那么您需要连接一个文件路径。在这种情况下,如果您不能使用strcat
(或不想使用它),那么您将不得不编写自己的连接函数。%s
扩展不是语言语法。它是printf
相关库函数的一部分。(其中一个相关函数是snprintf
,与重复调用 相比,这通常是在运行时创建字符串的更安全、更方便的方法strcat
。但是,如果strcat
您无法使用,则似乎不太可能snprintf
。)