我尝试使用exec系列函数从我的C程序执行perl脚本。
第一次使用execv尝试给我一个无限循环,所以我检查了execv的手册页,看到所有这个函数调用execve更适合我想做的事情。
放弃知道为什么我有一个无限循环(是的,这不聪明,我知道),我打算使用execve,但这个也失败了“没有这样的文件或目录”。
所以我再次检查手册页,看看
[...]
filename必须是二进制可执行文件,或者是以表格行开头的脚本:
#!解释器[optional-arg]
有关后一种情况的详细信息,请参阅下面的“解释程序脚本”。
[...]
ENOENT
文件文件名或脚本或ELF解释器不存在,或者a 无法找到文件或解释器所需的共享库。
所以我编写了一个代码来检查我的perl脚本和解释器是否都存在。
#define PERL_FILE "/home/path/script.pl"
int main(int argc, char *argv[], char *env[])
{
FILE *test;
char buffer[200];
/* Test if PERL_FILE exist */
if (!(test = fopen(PERL_FILE, "r"))) {
fprintf(stderr, "main : fopen("PERL_FILE") : %s\n", strerror(errno));
return (EXIT_FAILURE);
}
/* Retrieve the beginning of the PERL_FILE file */
if (fread(buffer, 1, sizeof(buffer), test) <= 0) {
fprintf(stderr, "main : fread : %s\n", strerror(errno));
return (EXIT_FAILURE);
}
fclose(test);
/* I want to check if the file in the shebang exist */
*strchr(buffer, '\r') = '\0';
printf("shebang = |%s|\n", buffer + 2);
if (!(test = fopen(buffer + 2, "r"))) {
fprintf(stderr, "main : fopen(%s) : %s\n", buffer + 2, strerror(errno));
return (EXIT_FAILURE);
}
fclose(test);
char *argv2[] = {PERL_FILE, NULL};
int i;
for (i = 0; env[i]; ++i) {
printf("%s\n", env[i]);
}
execve(PERL_FILE, argv2, env);
perror ("And so ... ");
return (EXIT_FAILURE);
}
这是我的perl脚本的内容:
#!的/ usr / bin中/ perl的
打印“Hello world!\ n”;
这里是代码执行的结果:
shebang = | / usr / bin / perl |
[...]
USER =根
PATH =的/ usr / local / sbin中:在/ usr / local / bin中:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中
SHELL = / bin / bash
[...]
所以......:没有这样的文件或目录
(我编辑是为了清理我的环境)。
所以这一切导致了我的问题:我做错了什么? 我不能用exec函数系列执行Perl脚本吗?
我在shebang和解释器之间添加了一个空格(比如“#!/ usr / bin / perl”)但是也失败了。 我用“系统”取得了成功,但我并没有使用它。
感谢您的阅读。