我正在开发一个简单的应用程序,它执行以下操作:
主应用程序将在子进程中通过exec调用来调用应用程序。此应用程序实际上正在执行固件下载操作。 例如。 execl(“/ usr / bin / fwdownload”,“fwdownload”,“args”,NULL);
在父进程中,我将再次分叉它,以便我将再次进行子进程。在这个子进程中,我正在调用Xmodem实用程序来从本地计算机接收固件映像文件。我将收到的数据包写入指定的fifo文件(使用mkfifo创建)。这个名为fifo的文件将通过“fwdownload”应用程序访问,以读取数据包以刷新固件。
再次在父进程中,我在xmodem文件传输发生时检查“fwdownload”应用程序的状态。
我面临的问题是:
我无法在父进程失败时获取“fwdownload”应用程序的状态。如何获得这种状态。尝试了所有可能的方式
每当我从“fwdownload”应用程序中获取失败状态时,如何终止通过第二个子进程调用的xmodem实用程序? 。
伪代码:
void SIGTERM_Handler(int signal)
{
exit(0); // Kill the Xmodem utility
}
int main()
{
pid_t cpid_1, cpid_2 ;
cpid_1 = fork();
if( cpid_1 == 0 ) // child process
{
execl("/usr/bin/fwdownload", "fwdownload", NULL);
printf("exec Failed");
exit(FAILED);
}
else // Parent process
{
cpid_2 = fork();
if( cpid_2 == 0 )
{
mkfifo("/tmp/fifo_file");
signal(SIGTERM, SIGTERM_Handler);
execl("/bin/rx", "rx", "/tmp/fifo_file", NULL); // fifo_file
printf("exec failed");
exit(FAILED);
}
else
{
wait_status = waitpid(cpid_1, &status, WUNTRACED | WCONTINUED);
if( WIFEXITED(status))
{
kill(cpid_2, SIGTERM);
printf(" FW Download app is exited \n");
}
}
}
}
答案 0 :(得分:1)
要获取已终止进程的状态,可以使用WEXITSTATUS(status)宏。该宏将为您提供子进程返回的代码。
在调用execl之前捕获信号也没用,因为(摘自execve手册页):
正在捕获的任何信号的处置都会重置为默认值(signal(7))。
在您的情况下,您会收到以下代码:
int main()
{
pid_t cpid_1, cpid_2 ;
cpid_1 = fork();
if( cpid_1 == 0 ) // child process
{
execl("/usr/bin/fwdownload", "fwdownload", NULL);
printf("exec Failed");
exit(FAILED);
}
else // Parent process
{
cpid_2 = fork();
if( cpid_2 == 0 )
{
mkfifo("/tmp/fifo_file");
//signal(SIGTERM, SIGTERM_Handler);
execl("/bin/rx", "rx", "/tmp/fifo_file", NULL); // fifo_file
printf("exec failed");
exit(FAILED);
}
else
{
wait_status = waitpid(cpid_1, &status, WUNTRACED | WCONTINUED);
if( WIFEXITED(status) && WEXITSTATUS(status) != 0)
{
kill(cpid_2, SIGTERM);
printf(" FW Download app is exited \n");
}
}
}
}