#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. Мне удалось исправить путь, но проблема в том, что я не получаю от программы то, что мне нужно, я предполагаю, что используемый подход неверен, но я не совсем уверен, как получить то, что я хочу(код состояния), и это просто дает код выхода.