perl中的“没有子进程”错误

时间:2011-04-09 17:37:24

标签: perl unix sql-loader

我有一个Perl脚本,它调用sqlldr并将数据从平面文件加载到表中。

现在,我的问题是,即使sqlldr正好加载表,它返回退出代码为-1(通过使用$?得到),当我尝试使用$!时它说{{1 }}

我正在使用No child processes命令

执行此脚本
sudo

如果我直接从我的用户ID执行它,这个Perl脚本工作正常。我真的不明白为什么只有当我通过sudo用户执行时才出现此错误。

请帮我理解这个错误。

编辑:如果我在代码中提供sudo -u <uname> bash <script_name>.pl ,它工作正常。但是,如果我删除此步骤,问题将再次出现。当我浏览这个错误时,我从WWW获得了这个代码。知道它的作用吗?

1 个答案:

答案 0 :(得分:1)

在大多数Unix平台上,CHLD(有时也称为CLD)信号对'IGNORE'的值有特殊行为。在这样的平台上将$SIG{CHLD}设置为'IGNORE'会导致当父进程在其子进程上无法wait()(即自动获取子进程)时不创建僵尸进程。将wait()设置为$SIG{CHLD}时调用'IGNORE'通常会在此类平台上返回-1
摘自http://perl.active-venture.com/pod/perlipc-signal.html

基本上发生的事情是CHLD信号可能由sqlldr 设置为IGNORE 。当您尝试检查子进程的状态时,您会收到-1,有时也称为ECHILD。发生这种情况的原因是由于忽略了CHLD信号,有关子进程完成状态的信息已被丢弃。通过设置$SIG{CHLD} = 'DEFAULT';,您指示CHLD信号应由DEFAULT处理程序处理,而不是被忽略。

我不知道为什么从sudo用户执行脚本时忽略CHLD信号而不是直接从用户ID执行。