LINUX.ORG.RU

fcloseall не работает

 


1

1

Update: я перепутал дескрипторы (int fd) с потоками (FILE *).

Почему fcloseall ничего не закрывает? Я даже пробовал открывать файл через fopen...

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

int main(int argc, char *argv[], char *envp[]) {
  printf("HABA!\n");
  int fd = open("/etc/resolv.conf", 0);
  if (fd < 0) {
    printf("oblom\n");
  }
  int r = fcloseall();
  printf("SURPRISE! %d\n", r);
  return 0;
}

Ответ на: комментарий от ossa

Ай, туплю. Я думал оно дескрипторы закрывает, а оно закрывает «потоки».

true_admin ★★★★★ ()

Черезжопно работает. Действительно, ведь должны были и 0,1,2 закрыться. А хрен.

И еще, вот так:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

int main(int argc, char *argv[], char *envp[]) {
  printf("HABA!\n");
  FILE* F = fopen("/etc/resolv.conf", "r");
  if (!F) {
    printf("oblom\n");
    return 1;
  }
  int r = fcloseall();
  sleep(2);
  printf("SURPRISE! %d\n", r);
  char str[300];
  fgets(str, 299, F);
  printf("readed:\n%s\n", str);

  return 0;
}
он мне еще и первую строчку resolv.conf считывает, прежде чем все позакрывать.

А вот в случае с простым open не закрывается fd, так и fcloseall вроде бы только буферизуемые должен был закрывать.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Черт! Вот что значит — не работаю почти с этими дурацкими потоковыми функциями! fgets же строку считывает!

Так вот, несмотря на fcloseall, он мне целиком resolv.conf прочел.

Eddy_Em ☆☆☆☆☆ ()

Ну я вашпе ничего не понял:

cat cls.c 
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>

int main(){
  printf("HABA!\n");
  FILE* F = fopen("/etc/resolv.conf", "r");
  if (!F)  return 1;
  printf("fcloseall: %d\n", fcloseall());
  char str[300];
  if(fgets(str, 299, F)) printf("readed:\n%s\n", str);
  else printf("closed!\n");
  fclose(F);
//  fclose(stdout);
  fflush(NULL);
  if(fgets(str, 299, F)) printf("readed:\n%s\n", str);
  else printf("closed!\n");
  return 0;
}

запускаем:

gcc cls.c -Wall -Werror -Wextra
./a.out 
HABA!
fcloseall: 0
readed:
search sao.ru

closed!
Если раскомментировать fclose(stdout), то как и положено, ничего выведено не будет.

На кой фиг эта функция, если не работает?

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.