我试图用C语言获取shell命令的状态代码(echo是0,cat/proc/1/mem是13等等),但我无法理解如何去做。
我试过:
#包括<;unistd.h>;
#包括<;标准h>;
#包括<;stdlib.h>;
#包括<;sys/wait.h>;
#包括<;系统/类型h>;
int main(){
pid_t pid=fork();
如果(pid==0){
execl(“home/rares/Documents/OS/Lab5/testex.c”、“bin/sh”、“cat/proc/1/mem”,NULL);
}
智力状态;
waitpid(pid和状态,0);
如果(妻子退出(状态)){
int exit_stauts=WEXITSTATUS(状态);
printf(“存在状态为%d\n”,退出状态”);
}
返回0;
}
以及:
#包括<;unistd.h>;
#包括<;标准h>;
#包括<;stdlib.h>;
#包括<;sys/wait.h>;
int main(){
int x=系统(“cat/proc/1/mem”);
如果(x==0){
printf(";命令成功\n";);
printf(“退出状态为%d\n”,WEXITSTATUS(x));
}else if(WIFSIGNALED(x)){
printf(“命令术语,带有信号%d\n”,WTERMSIG(x));
}否则如果(妻子退出(x)){
printf(“命令存在%d\n”,WEXITSTATUS(x));
}
返回0;
}
但它们似乎不起作用
也许我的方法已经完全过时了,但除了我应该使用fork()、waitpid()和execl()之外,我找不到任何东西。此外,如果我的任何功能没有正确使用,请让我知道
在第一种情况下,问题是您的execl失败(可能没有名为/home/rares/Documents/OS/Lab5/testex.c的可执行文件)。然后子级执行waitpid(0等待其自身不存在的子级,并以返回代码0终止。然后,父级执行序列,等待以0成功终止的子级。您可以通过以下方式观察到更好的行为:
#包括<;unistd.h>;
#包括<;标准高度>;
#包括<;stdlib.h>;
#包括<;sys/wait.h>;
#包括<;系统/类型.h>;
int main(){
pid_t pid=fork();
如果(pid==0){
execl(“home/rares/Documents/OS/Lab5/testex.c”、“bin/sh”、“cat/proc/1/mem”,NULL);
返回退出失败;
}
智力状态;
waitpid(pid和状态,0);
如果(妻子退出(状态)){
int exit_stauts=WEXITSTATUS(状态);
printf(“存在状态为%d\n”,退出状态”);
}
返回0;
}
在第二种情况下,命令不存在cat/proc/1/mem