【问题标题】:embedded perl in C - set working directory在 C 中嵌入 perl - 设置工作目录
【发布时间】:2017-09-01 12:51:01
【问题描述】:

如何告诉 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;

上述代码在单独的线程中运行。也许有什么需要考虑的?

感谢任何提示!

【问题讨论】:

  • 我不知道嵌入式 Perl 使用的工作目录与嵌入它的进程不同。这个工作目录是不是和整个进程的当前工作目录一样,可以在C中用getcwd查询,在C程序中用chdir更改?
  • 不,似乎不是这样。我试过这个,但奇怪的是这对脚本的工作目录没有影响。顺便说一句,我正在使用 Qt5 功能来更改目录。但我无法想象 Qt5 有什么副作用。
  • 查看我的回复,我只是使用chdir 更改工作目录,它会影响之后运行的 Perl 代码。我不知道你到底尝试了什么,但它对我来说符合预期。
  • CWD 是进程的属性。 Perl 没有要设置的 CWD。​​span>

标签: c perl


【解决方案1】:

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


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

#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 没有单独的工作目录:它只使用当前在进程中设置的目录。

【讨论】:

  • 这正是我在我的代码中所做的。在 perl_run() 之前,我已经将工作目录设置为我想要的。但是 perl 脚本仍然有与以前相同的目录。注意,包含 chdir 的 perl_run() 是在单独的线程中执行的。也许有什么需要考虑的?
  • @Karl:在大多数系统上,所有线程共享同一个工作目录,即不是每个线程。另见stackoverflow.com/questions/9082804/…
【解决方案2】:

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

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

【讨论】:

  • hmmm,刚刚尝试将环境 PWD 设置为路径。没用。
  • @Karl,Zac 说你可能需要设置 both
  • @Zac B,虽然某些期望从 shell 运行的程序可能会使用 $ENV{PWD},但这并不是一个安全的假设。使用 $ENV{PWD} 的 Perl 程序有问题。
  • 同意。我更新了我的答案以反映这一点。我认为它仍然值得检查,因为它在许多 Perl 程序中无处不在(例如,Cwd 模块使用 PWD)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2021-11-12
  • 2018-08-27
  • 2023-03-23
相关资源
最近更新 更多