Sigchld Can';t忽略信号CHLD,强制默认 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(){ 信号(信号灯、信号灯); pid_t pid=vfork(); if(pid
Perl发出此警告。就Perl而言,glibc的最新版本(或Linux内核中的特定选项)似乎已经删除了忽略SIGCHLD的功能。我不知道为什么会出现这种情况,但我只是在一个以前乐于忽略SIGCHLD的系统上遇到了它 根据perldoc perlipc的Sigchld Can';t忽略信号CHLD,强制默认 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(){ 信号(信号灯、信号灯); pid_t pid=vfork(); if(pid,sigchld,Sigchld,Perl发出此警告。就Perl而言,glibc的最新版本(或Linux内核中的特定选项)似乎已经删除了忽略SIGCHLD的功能。我不知道为什么会出现这种情况,但我只是在一个以前乐于忽略SIGCHLD的系统上遇到了它 根据perldoc perlipc的perldoc perlipc,您肯定应该查看它以了解更多信息,解决这一问题的最佳方法是: 使用POSIX“:sys_wait_h”#进行非阻塞读取 $SIG{CHLD}=sub{ 而((my$child=waitpid(-1,WNOHANG))>
perldoc perlipc
,您肯定应该查看它以了解更多信息,解决这一问题的最佳方法是:
使用POSIX“:sys_wait_h”#进行非阻塞读取
$SIG{CHLD}=sub{
而((my$child=waitpid(-1,WNOHANG))>0){
#$Kid_Status{$child}=$?;
}
};
#做一些分叉的事情。。。
带有$Kid_Status
的行来自最初的perldoc,但我对它进行了注释,因为其目的是忽略子进程,我想明确指出,while
的内部不需要包含任何代码erl脚本用于后台监控,或者如果您打算在处理程序中执行exec
或die
如果您无法编辑正在调用的Perl脚本,那么我建议在execvp
命令用户忽略虚假警告之前打印一行到STDERR
fputs(“下一行是无害警告。\n”,stderr);
#include <sys/types.h>
#include <stddef.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <iostream>
#include <unistd.h>
int main(){
signal(SIGCHLD,SIG_IGN );
pid_t pid = vfork();
if(pid <0){
std::cout<< "Error: Fork failed at main!!!";
exit(1);
}else if (0 == pid){
char * cmd[] ={(char*)"../work/C++11/Prj_LargeFile/script/Logger.pl",NULL};
//char * cmd[] = {(char*)"pwd",NULL};
//char * cmd[] = {(char*)"/usr/bin/perl",(char*)"../work/C++11/Prj_LargeFile/script/Logger.pl",NULL};
execvp(cmd[0],cmd);
_exit(0);
}
}