2013-10-03 4 views
0

Я запускаю процесс и запускаю команду wc с использованием execl. Теперь под правильными аргументами, она работает нормально, но когда я даю неверное имя файла, он выходит из строя, но в обоих случаях возвращаемое значение WEXITSTATUS(status) всегда 0.WEXITSTATUS всегда возвращает 0

Я считаю, что что-то не так с тем, что я я делаю, но я не уверен, что это такое. Чтение справочных страниц и Google предполагает, что я должен получить правильное значение в соответствии с кодом состояния.

Вот мой код:

#include <iostream> 
#include <unistd.h> 

int main(int argc, const char * argv[]) 
{ 
    pid_t pid = fork(); 
    if(pid <0){ 
     printf("error condition"); 
    } else if(pid == 0) { 
     printf("child process"); 
     execl("/usr/bin/wc", "wc", "-l", "/Users/gabbi/learning/test/xyz.st",NULL); 
     printf("this happened"); 
    } else { 
     int status; 
     wait(&status); 

     if(WIFEXITED(status)) { 
      std::cout << "Child terminated normally" << std::endl; 
      printf("exit status is %d",WEXITSTATUS(status)); 
      return 0; 
     } else {  
     } 
    } 
} 
+1

Вы '#include '? –

+0

@KerrekSB: если '' включает '' (или '' делает), тогда код не будет компилироваться без использования ''. (Сказав это, он скомпилировал ОК на Mac OS X 10.8.5 с GCC 4.8.1 без явного «», к моему большому удивлению!) Смешайте 'printf()' и 'cout' любопытно, будем ли мы сказать. Это C++ - просто. Но только так. Сообщения 'printf()' должны заканчиваться новой строкой. Когда я запускаю код, я получаю: 'wc: /Users/gabbi/learning/test/xyz.st: open: нет такого файла или каталога' и ' Ребенок завершен нормально 'и 'статус выхода 1' - как желательно. –

+0

"* ... когда я даю неправильное имя файла ... *", пожалуйста, уточните, к какому имени файла вы обращаетесь. – alk

ответ

-1

Это был вопрос Xcode, работает с консоли отлично работает. Я парень Java, выполняющий некоторые задания в CPP. Тем не менее, это может пригодиться кому-то, кто застрял в подобной проблеме.

1

Если вы указываете имя несуществующего файла, execl() в качестве 1-го аргумента она не сможет. Если это произойдет, программа уйдет без возврата какого-либо определенного значения. Таким образом возвращается значение 0.

Вы можете исправить, например, так:

#include <errno.h> 

... 

int main(int argc, const char * argv[]) 
{ 
    pid_t pid = fork(); 
    if(pid <0){ 
    printf("error condition"); 
    } else if(pid == 0) { 
    printf("child process"); 
    execl(...); /* In case exec succeeds it never returns. */ 
    perror("execl() failed"); 
    return errno; /* In case exec fails return something different then 0. */ 
    } 
    ... 
0

Вы не передавая имя файла из ARGV дочернего процесса

Вместо

execl("/usr/bin/wc", "wc", "-l", "/Users/gabbi/learning/test/xyz.st",NULL); 

Попробуйте,

execl("/usr/bin/wc", "wc", "-l", argv[1],NULL); 

Выход я на моей машине

[email protected]:~/cpp$ ./a.out test.txt 
6 test.txt 
Child terminated normally 
exit status is 0 

[email protected]:~/cpp$ ./a.out /test.txt 
wc: /test.txt: No such file or directory 
Child terminated normally 
exit status is 1 
Смежные вопросы