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

Sem*_*nit 5 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的提示!

Zac*_*c B 1

在周围的 C 中做chidir可能还不够,除非您还确保PWD周围代码的环境中的字段也被更新。否则,该变量可能会被$ENV{PWD}您的 perl 继承,因为您将NULL作为最终参数传递给perl_parse. 但并不能 100% 确定这一点。

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

  • @Zac B,虽然某些希望从 shell 运行的程序可能使用“$ENV{PWD}”,但这不是一个安全的假设。使用 `$ENV{PWD}` 的 Perl 程序有错误。 (2认同)