确定execvp是否成功或失败
我正在寻找一种方法来确定函数execvp是否成功或失败。我知道如果它返回,那么它就失败了,但是我正在寻找一个从execvp启动的命令失败的例子。例如,“ls”试图列出一个不存在的文件夹。在此基础上,我计划添加对逻辑运算符的支持(例如&&、| |)。谢谢确定execvp是否成功或失败,c,unix,C,Unix,我正在寻找一种方法来确定函数execvp是否成功或失败。我知道如果它返回,那么它就失败了,但是我正在寻找一个从execvp启动的命令失败的例子。例如,“ls”试图列出一个不存在的文件夹。在此基础上,我计划添加对逻辑运算符的支持(例如&&、| |)。谢谢 else{ 智力状态; 如果(等待(&status)0){pid=waitpid(c_pid,&status,0);if(pid=-1){perror(“wait failed”);exit(0);}if(status==0){success=t
else{
智力状态;
如果(等待(&status)<0){
perror(“等待失败”);
出口(0);
}
如果(状态==0){
成功=真实;
}
否则{
成功=错误;
}
}
您需要首先fork()
一个新进程,然后让新进程调用execvp
。然后,父进程应该调用wait()
,这将允许它检索您运行的命令的退出状态(ls
,在本例中)
检查从wait()
检索到的返回状态时,请确保使用WIFEXITED()
确保子项正常退出,并使用WEXITSTATUS()
提取退出状态
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
exit(1);
} else if (pid == 0) {
execlp("/bin/ls","ls","-l","xyz",NULL);
perror("exec failed");
exit(1);
} else {
int status;
pid = wait(&status);
if (WIFEXITED(status)) {
printf("pid %d exited with status %d\n", pid, WEXITSTATUS(status));
} else {
printf("pid %d exited abnormally\n"
}
}
现在我有这个,在我的检查结束时,看看fork是否失败了。但我认为我没有从状态中寻找正确的信息
else if(c_pid>0){pid=waitpid(c_pid,&status,0);if(pid=-1){perror(“wait failed”);exit(0);}if(status==0){success=true;}success=false;/*if((pid=wait(&status))<0){perror(“wait…”);exit(1)}/}
@xythyl使用您的代码更新您的问题。这是不可能在评论中阅读的。谢谢!还有,如何在这里正确地发布代码?由于某些原因,它没有保存任何格式。@xythy将代码粘贴到您的问题中,然后按编辑窗口顶部的“{}
”按钮对其进行格式设置。如何等待
获取肯定状态?根据研究,似乎等待实际上并不能决定执行成功与否。
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
exit(1);
} else if (pid == 0) {
execlp("/bin/ls","ls","-l","xyz",NULL);
perror("exec failed");
exit(1);
} else {
int status;
pid = wait(&status);
if (WIFEXITED(status)) {
printf("pid %d exited with status %d\n", pid, WEXITSTATUS(status));
} else {
printf("pid %d exited abnormally\n"
}
}