使用带有参数 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
的变体(execlp
、execvp
等)如果第一个参数不包含,则对其第一个参数的解释不同一个/
。在这种情况下,将在 PATH
环境变量(或特定于库的默认值,通常为 /usr:/usr/bin
)中列出的目录中搜索路径名。由于.
通常不包含在PATH
中,因此不会在当前工作目录中搜索文件名。
由于您使用的 shell 重复了 execlp
的功能,您不能 运行 在当前工作目录中仅通过指定文件名来执行可执行文件。您必须写 ./omer
而不是 omer
。 (当然,除非您将 .
添加到 PATH
。出于安全原因,不建议这样做。)由于 ./omer
包含斜杠,因此不会导致 PATH
搜索.
但这不适用于 execl
,因此没有必要包含 /
以强制使用相对路径。
如果您确实觉得需要指定特定目录(例如 /usr/share/lib/myapp
),那么您需要连接一个文件路径。在那种情况下,如果您不能使用 strcat
(或不想使用它),那么您将不得不编写自己的连接函数。 %s
扩展不是语言语法。它是 printf
和相关库函数的一部分。 (其中一个相关函数是 snprintf
,与重复调用 strcat
相比,它通常是一种在 运行 时创建字符串的更安全、更方便的方法。但是,如果 strcat
对您不可用,snprintf
似乎不太可能。)
我制作了一个获取目录路径的程序,编译该目录文件夹中的文件并执行它们。
现在我尝试使用 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
的变体(execlp
、execvp
等)如果第一个参数不包含,则对其第一个参数的解释不同一个/
。在这种情况下,将在 PATH
环境变量(或特定于库的默认值,通常为 /usr:/usr/bin
)中列出的目录中搜索路径名。由于.
通常不包含在PATH
中,因此不会在当前工作目录中搜索文件名。
由于您使用的 shell 重复了 execlp
的功能,您不能 运行 在当前工作目录中仅通过指定文件名来执行可执行文件。您必须写 ./omer
而不是 omer
。 (当然,除非您将 .
添加到 PATH
。出于安全原因,不建议这样做。)由于 ./omer
包含斜杠,因此不会导致 PATH
搜索.
但这不适用于 execl
,因此没有必要包含 /
以强制使用相对路径。
如果您确实觉得需要指定特定目录(例如 /usr/share/lib/myapp
),那么您需要连接一个文件路径。在那种情况下,如果您不能使用 strcat
(或不想使用它),那么您将不得不编写自己的连接函数。 %s
扩展不是语言语法。它是 printf
和相关库函数的一部分。 (其中一个相关函数是 snprintf
,与重复调用 strcat
相比,它通常是一种在 运行 时创建字符串的更安全、更方便的方法。但是,如果 strcat
对您不可用,snprintf
似乎不太可能。)