2013-03-24 2 views
0

Я пытаюсь создать программу, которая получает 2 патча для файлов на главную и вызывает команду cmp linux для их сравнения.Вызов командной строки linux cmp с программой C

Если они равны, я хочу вернуться 2, и если они отличаются, 1.

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(int argc, const char* argv[]) 
{ 
pid_t pid; 
int stat; 

//child process 
if ((pid=fork())==0) 
{ 
    execl("/usr/bin/cmp", "/usr/bin/cmp", "-s",argv[1], argv[2], NULL); 
} 
//parent process 
else 
{ 
    WEXITSTATUS(stat); 
    if(stat==0) 
     return 2; 
    else if(stat==1) 
     return 1; //never reach here 
} 
printf("%d\n",stat); 
return 0; 
} 

По какой-то причине, если файлы одинаковы, я добиться успеха в возвращении 2, но если они 're different, он не войдет в if (stat == 1), а для возврата 0. Почему это происходит? Я проверил, что cmp на файлах через терминал действительно возвращает 1, если они разные, поэтому почему это не работает?

+1

Там в макрос 'WEXITSTATUS' для получения возвращаемого значения. Также убедитесь, что cmp возвращает значение один из ошибок, а не 'non-zero'. – Aneri

+0

он возвращает> 1 на ошибку, и 1, если файлы отличаются. Зачем? – Jjang

+0

P.S изменен на WEXITSTATUS, теперь он всегда возвращает 2 (stat == 0 всегда) – Jjang

ответ

2

Делают это так:

//parent process 
else 
{ 
    // get the wait status value, which possibly contains the exit status value (if WIFEXITED) 
    wait(&status); 
    // if the process exited normally (i.e. not by signal) 
    if (WIFEXITED(status)) 
    // retrieve the exit status 
    status = WEXITSTATUS(status); 
    // ... 
1

В коде:

WEXITSTATUS(&stat); 

пытается извлечь статус из указателя, но WEXITSTATUS() принимает int в качестве параметра.

Должно быть:

WEXITSTATUS(stat);