当文件不存在时,execl错误==“文件存在”

时间:2017-11-24 03:00:43

标签: c execl

我正在尝试理解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

为什么它不像“文件不存在”?

1 个答案:

答案 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;
}