我是LINUX C编程的新手,我的任务是编写一个关于进程的程序。
我需要处理两个进程,父进程和子进程。
我的目标是让父分叉一个进程(子进程),然后子进程执行一个可能终止失败的程序。父进程等待子进程终止,并获取从子信号启动的信号,如中止或分段错误。
但是,我遇到了一些问题。
我发现"核心行动"信号可以很容易地被检测到,但是"术语动作"无法检测到!!
"定期行动"信号,例如SIGALRM(14)或SIGINT(2),不能被检测到。 它似乎被归类为终止成功。
这是我的代码:
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <cstring>
#include <errno.h>
using namespace std;
bool check = true;
void mySignal( int sig ){
int status;
pid_t childPid = wait( &status ) ;
if( WIFEXITED( status ) ){
printf("The child is terminated success!!\n");
}
else{
if( WIFSIGNALED( status ) ){
int termsig = WTERMSIG( status ) ;
printf("termsig = %d %d\n",status, termsig ) ;
}
}
check = false ;
}
int main( int argc , char *argv[] ){
signal( SIGCHLD, mySignal ) ;
pid_t pid = fork() ;
if( pid < 0 ){
printf("fork error\n");
exit( -1 ) ;
}
else if( pid == 0 ){
execl( argv[1], NULL );
exit( 0 ) ;
}
while( check ) ;
return 0 ;
}
有谁知道如何解决这个问题?
答案 0 :(得分:0)
void mySignal( int sig ){
int status;
pid_t childPid = wait( &status ) ;
if( WIFEXITED( status ) ){
printf("The child is terminated success!!\n");
}
if( WIFSIGNALED( status ) ){
int termsig = WTERMSIG( status ) ;
printf("termsig = %d %d\n",status, termsig ) ;
}
check = false ;
}
信号并不总是结束一个程序,使你的条件毫无意义。
答案 1 :(得分:0)
你应该这样做:
if(WEXITED(status)){
printf("Child %d exited with exit code %d.\n", (int)pid, WEXITSTATUS(status));
// Note that a non-zero exit status normally indicates some kind of error.
}
else if(WIFSIGNALED(status)){
printf(
"Child %d terminated with signal %d, with%s a core dump.\n",
(int)pid, WTERMSIG(status), WCOREDUMP(status)? "": "out"
);
}
else if(WSTOPPED(status)){
printf("Child %d was stopped by signal %d.\n", (int)pid, WSTOPSIG(status));
}
else{
fprintf(stderr, "Unexpected signal condition.\n");
}
如上所述,非零退出状态通常表示错误。您应该在代码中执行此操作:exit(0)
之后的execl()
仅在execl()
的调用失败时执行,因此您更喜欢说exit(1)
之类的内容}或exit(EX_UNAVAILABLE)
(来自<sysexits.h>
)。