嵌入式perl在C - set工作目录中

时间:2017-09-01 12:51:02

标签: c perl

如何告诉C中的嵌入式perl它的工作目录是什么?

它似乎设置为使用嵌入式perl的可执行文件的目录。在调用嵌入的perl之前从外部设置目录并不会改变它的行为。

可能的解决方法是弹出" chdir"在实际脚本开始之前但我不喜欢这样。

我的代码在技术上看起来像这样:

PERL_SYS_INIT3(NULL, NULL, NULL);
my_perl = perl_alloc();
PERL_SET_CONTEXT(my_perl);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
PERL_SET_CONTEXT(my_perl);
PL_perl_destruct_level = 1;
perl_construct(my_perl);

int argc = 2;
char** argv = new char*[argc];
argv[0] = new char[4096];
argv[0][0] = '\0';
argv[1] = scriptFileName;

PERL_SET_CONTEXT(my_perl);
perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
perl_run(my_perl)

PL_perl_destruct_level = 1;
PERL_SET_CONTEXT(my_perl);
perl_destruct(my_perl);
perl_free(my_perl);
my_perl = NULL;

上面列出的代码在不同的线程中运行。也许有什么需要考虑的事情?

感谢任何提示!

2 个答案:

答案 0 :(得分:4)

Perl没有单独的工作目录。它只需要过程中当前活动的那个,可以使用chdir从C程序内部进行更改。

为了证明这一点,我在官方文档中使用Adding a Perl interpreter to your C program中的代码尝试了一个小示例程序。在执行chdir之前,我只添加了一个perl_run来电:

#include <EXTERN.h>               /* from the Perl distribution     */
#include <perl.h>                 /* from the Perl distribution     */

static PerlInterpreter *my_perl;  /***    The Perl interpreter    ***/

int main(int argc, char **argv, char **env)
{
       PERL_SYS_INIT3(&argc, &argv, &env);
       my_perl = perl_alloc();
       perl_construct(my_perl);
       PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
       perl_parse(my_perl, NULL, argc, argv, (char **) NULL);

       /***** HERE IT CHANGES THE WORKING DIRECTORY ******/
       chdir("/"); 

       perl_run(my_perl);
       perl_destruct(my_perl);
       perl_free(my_perl);
       PERL_SYS_TERM();
}

当启动以下小的Perl程序来检查工作目录时,它显示了我在C代码中设置的工作目录:

use Cwd 'getcwd';  
print getcwd(), "\n";

因此Perl没有单独的工作目录:它只需要当前在该过程中设置的目录。

答案 1 :(得分:1)

在周围的C中执行chidir可能还不够,除非您还确保周围代码环境中的PWD字段也已更新。否则,您的perl可能会将该变量继承为$ENV{PWD},因为您将NULL作为最终参数传递给perl_parse。虽然不是100%肯定。

非shell代码不应该依赖于PWD环境变量,正如@ikegami所指出的那样。但是,一些写得不好的代码可能依赖于它,所以值得检查。