Хотите получить код состояния команды оболочки?

#c #unix #process #fork #waitpid

Вопрос:

Я пытаюсь получить код состояния команды оболочки на C(echo-0,cat/proc/1/mem-13 и так далее), Но я не могу понять, как это сделать. Я пытался :

 #include lt;unistd.hgt; #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;sys/wait.hgt; #include lt;sys/types.hgt;  int main() {  pid_t pid=fork();  if(pid==0) {  execl("/home/rares/Documents/OS/Lab5/testex.c","bin/sh","cat/proc/1/mem",NULL);  }  int status;  waitpid(pid,amp;status,0);  if(WIFEXITED(status)) {  int exit_stauts=WEXITSTATUS(status);  printf("Exist status is %dn",exit_stauts );  }  return 0; }  

и :

 #include lt;unistd.hgt; #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;sys/wait.hgt;  int main() {  int x=system("cat/proc/1/mem");  if(x==0) {  printf("command succeededn");  printf("exit status is %dn",WEXITSTATUS(x));  } else if ( WIFSIGNALED(x)) {  printf("command termianted with signal%dn",WTERMSIG(x));  } else if(WIFEXITED(x)) {  printf("command existed %dn",WEXITSTATUS(x));  }  return 0; }  

но они, похоже, не работают Может быть , мои подходы полностью ошибочны, но я не смог найти ничего, кроме того факта, что я должен использовать fork() , waitpid() и execl() . Кроме того, если какие-либо из моих функций используются неправильно, пожалуйста, дайте мне знать.

Комментарии:

1. Работает ли какая-либо из этих команд при вводе?

2. @stark да, hello world делает, но другой не делает, но echo не работает в программе

Ответ №1:

В первом случае проблема в том, что у execl вас не получается (вероятно, нет исполняемого файла с именем /home/rares/Documents/OS/Lab5/testex.c . Затем дочерний элемент выполняет a waitpid(0 , который ожидает своих собственных дочерних элементов, которых не существует, и завершается кодом возврата 0. Затем родитель выполняет последовательность, ожидает ребенка, который завершился успешно с 0. Вы можете наблюдать лучшее поведение с:

 #include lt;unistd.hgt; #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;sys/wait.hgt; #include lt;sys/types.hgt;  int main() {  pid_t pid=fork();  if(pid==0) {  execl("/home/rares/Documents/OS/Lab5/testex.c","bin/sh","cat/proc/1/mem",NULL);  return EXIT_FAILURE;  }  int status;  waitpid(pid,amp;status,0);  if(WIFEXITED(status)) {  int exit_stauts=WEXITSTATUS(status);  printf("Exist status is %dn",exit_stauts );  }  return 0; }  

Во втором случае команда не существует cat/proc/1/mem .

Комментарии:

1. Мне удалось исправить путь, но проблема в том, что я не получаю от программы то, что мне нужно, я предполагаю, что используемый подход неверен, но я не совсем уверен, как получить то, что я хочу(код состояния), и это просто дает код выхода.