确定execvp是成功还是失败

时间:2015-11-03 00:47:02

标签: c unix

我正在寻找一种方法来确定函数execvp是成功还是失败。我知道如果它返回然后它失败了,但我正在寻找从execvp启动的命令失败的情况。例如在" ls"正试图列出一个不存在的文件夹。由此我计划添加对逻辑运算符的支持(例如&&,||)。感谢。

public  function reports($service, $accountId, $adClientId,$adsense) 
{
 $startDate = '2015-10-01';
 $endDate = 'today';
 $optParams = array(
            'metric' => array('PAGE_VIEWS', 
                               'CLICKS',
                               'COST_PER_CLICK', 
                                'EARNINGS'
                             ),
             'dimension' => 'DATE',
             'sort' => '-DATE',
             'filter' => array(
             'CUSTOM_CHANNEL_ID==XXXXXXXXX'
  ),

  );
   $report = $service->accounts_reports->generate($accountId,$startDate,$endDate, $optParams);

 return $report;    

1 个答案:

答案 0 :(得分:3)

您需要先fork()一个新流程,然后让新流程调用execvp。然后,父进程应调用wait(),这将允许它检索您运行的命令的退出状态(在这种情况下为ls)。

检查从wait()检索的退货状态时,请务必使用WIFEXITED()确保孩子正常退出,并使用WEXITSTATUS()提取退出状态。

pid_t pid = fork();
if (pid == -1) {
    perror("fork failed");
    exit(1);
} else if (pid == 0) {
    execlp("/bin/ls","ls","-l","xyz",NULL);
    perror("exec failed");
    exit(1);
} else {
    int status;
    pid = wait(&status);
    if (WIFEXITED(status)) {
        printf("pid %d exited with status %d\n", pid, WEXITSTATUS(status));
    } else {
        printf("pid %d exited abnormally\n"
    }
}