如何在通过exec调用的父进程中获取已执行应用程序的状态?

时间:2016-06-09 19:08:18

标签: c linux fork exec embedded-linux

我正在开发一个简单的应用程序,它执行以下操作:

  1. 主应用程序将在子进程中通过exec调用来调用应用程序。此应用程序实际上正在执行固件下载操作。 例如。 execl(“/ usr / bin / fwdownload”,“fwdownload”,“args”,NULL);

  2. 在父进程中,我将再次分叉它,以便我将再次进行子进程。在这个子进程中,我正在调用Xmodem实用程序来从本地计算机接收固件映像文件。我将收到的数据包写入指定的fifo文件(使用mkfifo创建)。这个名为fifo的文件将通过“fwdownload”应用程序访问,以读取数据包以刷新固件。

  3. 再次在父进程中,我在xmodem文件传输发生时检查“fwdownload”应用程序的状态。

  4. 我面临的问题是:

    1. 我无法在父进程失败时获取“fwdownload”应用程序的状态。如何获得这种状态。尝试了所有可能的方式

    2. 每当我从“fwdownload”应用程序中获取失败状态时,如何终止通过第二个子进程调用的xmodem实用程序? 。

    3. 伪代码:

      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");                    
      
                  }       
              }           
          }  
      }
      

1 个答案:

答案 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");                    

            }       
        }           
    }  
}