Файл open() не существует, когда файл действительно существует

Я пишу простой HTTP-сервер, и я получаю возвращаемое значение файла не существует, когда файл существует

printf("%s\n", html_path);
if ((fd = open(html_path, "r")) >= 0){ //file found

  stat(file_name, &st);
  file_size = st.st_size;
  printf("%d\n", file_size);
  while (read(fd, response, RCVBUFSIZE) > 0){

  }
}
else { //file not found
    strcpy(response, "404 File not found\n");
    send(clntSocket, response, 32, 0);
}

оператор печати должен проверить путь, и он выглядит так:

/mounts/u-zon-d2/ugrad/kmwe236/HTML/index.html

обратите внимание, что этот путь находится на сервере, который мы используем в нашем университете. это путь, который показывает, когда я командую pwd

Я подтвердил, что файл существует. что-то не так с моим путем?


person Community    schedule 23.02.2016    source источник
comment
Первое, что заметил: возможно ли, что вы смешиваете open и fopen? r подходит для fopen, для open вы должны передать O_RDONLY.   -  person Dirk Herrmann    schedule 24.02.2016
comment
Откуда вы взяли функцию open? Если предполагается, что это системный вызов open(2), то у него другой прототип, и вы должны написать open(html_path, O_RDONLY). Или, может быть, вы хотели использовать fopen(3)? В любом случае, если это не удается, это не означает, что файл не существует: могут быть другие проблемы, например, у вас нет надлежащих прав доступа. Используйте strerror(3), чтобы распечатать фактическую причину ошибки.   -  person gudok    schedule 24.02.2016


Ответы (3)


Произошла ошибка при открытии файла, но вы не знаете, что это произошло, потому что файл не был найден, потому что вы не проверили значение errno.

В разделе else добавьте следующее:

else { //file not found
    // copy the value of errno since other function calls may change its value
    int err = errno;
    if (err == ENOENT) {
        strcpy(response, "404 File not found\n");
        send(clntSocket, response, 32, 0);
    } else {
        printf("file open failed: error code %d: %s\n", err, strerror(err));
    }
}

Если файл на самом деле не существует, вы правильно обработаете ошибку. Если нет, вы напечатаете сообщение об ошибке, в котором будет сказано, что произошло.

Вы также называете open неправильно. Второй параметр — это int, содержащий флаги. Чтобы открыть файл для чтения, используйте O_RDONLY.

person dbush    schedule 23.02.2016

open не имеет второго параметра в виде строки. Вы используете open с параметрами fopen. Для веб-сервера fopen, fprintf, fclose - лучший выбор, чем более низкоуровневое открытие, чтение,...

Привет, Крис

person chris01    schedule 23.02.2016

Вам нужно проверить, где выполняется ваша программа, поскольку она попытается открыть относительный путь из этого места. Для проверки используйте:

char cwd[1024];
getcwd(cwd, sizeof(cwd));
puts(cwd);

Затем вы можете объединить свой путь, используя:

strncat(cwd, html_path, 100);

Вы можете обнаружить, что вам нужно подняться на один каталог или что-то еще, чтобы затем найти файл, который вы ищете.

Также обратите внимание, что если вы отлаживаете свою программу через gdb, она может выполняться из места, отличного от вашего обычного места сборки, что может затруднить обнаружение ошибок.

person jigglypuff    schedule 23.02.2016