使用exec系列作为perl脚本

时间:2015-07-20 13:39:27

标签: c

我尝试使用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”)但是也失败了。 我用“系统”取得了成功,但我并没有使用它。

感谢您的阅读。

0 个答案:

没有答案