如何告诉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;
上面列出的代码在不同的线程中运行。也许有什么需要考虑的事情?
感谢任何提示!
答案 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所指出的那样。但是,一些写得不好的代码可能依赖于它,所以值得检查。