我正在尝试理解execl在尝试启动不存在的文件时返回的错误。
这是我的实验代码,其中main调用函数spawn1,它将创建fork并尝试启动execl:
# include <stdio.h>
# include <assert.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <unistd.h>
# include <stdlib.h>
int spawn1(char *, char *, char *);
int main(){
int i, t, tt, state;
for(i = 0; i < 10; i++){
t = spawn1("functiondoesntexist", "strange name", "argument");
if (t < 0){
perror("fork"); // fork error
break;
}
tt = wait(&state);
assert(tt == t);
if (state != 0){
perror("exec didn't work");
break;
}
}
return i != 10;
}
int spawn1(char * file, char * command, char * arg){
int t;
t = fork();
if (t < 0) // fork error
return -1;
if (t == 0){ // child
execl(file, command, arg, (void *)0);
exit(1);
}
// parent
return t;
}
返回的错误是:
exec didn't work: File exists
为什么它不像“文件不存在”?
答案 0 :(得分:4)
您未在正确的位置拨打perror
。
当功能失败时,您需要在失败的功能后检查errno
或立即致电perror
。在失败的系统或库函数之后调用的任何其他系统或库函数将使用自己的错误代码覆盖errno
。
将代码更改为立即调用perror
,如下所示:
int main(){
int i, t, tt, state;
for(i = 0; i < 10; i++){
t = spawn1("functiondoesntexist", "strange name", "argument");
if (t < 0){
fprintf(stderr, "fork failed\n"); // not perror
break;
}
tt = wait(&state);
assert(tt == t);
if (state != 0){
fprintf(stderr, "exec didn't work\n"); // not perror
break;
}
}
return i != 10;
}
int spawn1(char * file, char * command, char * arg){
int t;
t = fork();
if (t < 0) { // fork error
perror("fork failed"); // call perror here to check fork
return -1;
}
if (t == 0){ // child
execl(file, command, arg, (void *)0);
perror("exec failed"); // call perror here to check execl
exit(1);
}
// parent
return t;
}