2012-11-23 26 views
1

我有以下代码。如何获得fork()中execvp的错误?

我的问题是在代码

 int main() { 

      .... 

     if ((uproc.pid = fork()) == -1) { 
      return -1; 
     } 

     if (uproc.pid == 0) { 
      /* child */ 

      const char *argv[3]; 
      int i = 0; 
      argv[i++] = "/bin/sh"; 
      argv[i++] = "/my/script.sh"; 
      argv[i++] = NULL; 

      execvp(argv[0], (char **) argv); 
      exit(ESRCH); 

     } else if (uproc.pid < 0) 
      return -1; 

     /* parent */ 
     int status; 
     while (wait(&status) != uproc.pid) { 
      DD(DEBUG,"waiting for child to exit"); 
     } 

      // If /my/script.sh exit accidentally in some place with error. 
      // can I catch this error right here? 
      ...... 
    } 
+0

你通过wait函数进入状态变量。 –

+0

它可能是万一我的问题的答复 – MOHAMED

+0

状态始终为0,没有错误,万一有脚本 – MOHAMED

回答

4

孩子的退出状态是由wait功能提供,在status变量。

您可以通过使用WEXITSTATUS宏获得退出状态,但是只有当程序正常退出(即所谓的exit或从main函数返回):

if (WIFEXITED(status)) 
    printf("Child exit status: %d\n", WEXITSTATUS(status)); 
else 
    printf("Child exited abnormally\n"); 

阅读manual page for wait以获取更多信息。

+0

从OP的错误并不清楚(“* ...得到的错误cmd执行... *“),如果它真的是想要的退出代码。无论如何1+,因为这是所有人都可以得到的。 – alk

+0

我的脚本中间出现消息错误,因为中间存在错误。状态返回总是为0(在CAS中有脚本中的错误,而在CAS中没有) – MOHAMED

+0

所以,为什么不改变这一点,并让你的脚本只有在成功和任何错误调用'exit'时才使用'exit 0'与“0”不同的参数。 @MohamedKALLEL – alk