我有一个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/

10-12 16:30