我有一个Perl脚本,该脚本调用sqlldr并将数据从平面文件加载到表中。
现在,我的问题是,即使sqlldr很好地加载了表,它也会返回退出代码为-1(通过使用$?
来获取),当我尝试使用$!
时,它说的是No child processes
。
我正在使用sudo
命令执行此脚本
sudo -u <uname> bash
<script_name>.pl
如果我直接从用户ID执行此Perl脚本,则该脚本运行良好。我真的不明白为什么只有当我通过sudo用户执行时才会出现此错误。
请帮助我了解此错误。
编辑:如果我在我的代码中输入
$SIG{CHLD} = 'DEFAULT';
,则效果很好。但是,如果我删除此步骤,问题再次出现。当我浏览此错误时,我从WWW获得了此代码。知道它做什么吗? 最佳答案
在大多数Unix平台上,CHLD
(有时也称为CLD
)信号相对于'IGNORE'
的值具有特殊的行为。在这样的平台上将$SIG{CHLD}
设置为'IGNORE'
的效果是,当父进程无法在其子进程上对其进行wait()
时(即,自动获得子进程),则不会创建僵尸进程。在wait()
设置为$SIG{CHLD}
的情况下调用'IGNORE'
通常会在此类平台上返回-1
。
摘自http://perl.active-venture.com/pod/perlipc-signal.html
基本上发生的事情是sqltdr将CHLD
信号设置为IGNORE
。当您尝试检查子进程的状态时,您会收到-1
,有时也称为ECHILD
。发生这种情况的原因是,由于忽略了CHLD
信号,有关子进程完成状态的信息已被丢弃。通过设置$SIG{CHLD} = 'DEFAULT';
,您指示CHLD信号应由DEFAULT处理程序处理,并且不应忽略。
我不知道为什么从sudo用户执行脚本而不是直接从您的用户ID执行脚本时会忽略CHLD
信号。
关于perl - Perl中的“无子进程”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5606668/