Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - open vs fopen
Forum - C/C++ - open vs fopen

Avatar
Godrek (Normal User)
Pro


Messaggi: 76
Iscritto: 04/08/2015

Segnala al moderatore
Postato alle 14:32
Sabato, 15/06/2019
Salve,
volevo sapere come mai il seguente codice:

int fd = open("./text.txt" , O_WRONLY | O_CREAT | O_TRUNC);

funziona su Ubuntu ma non funzione su Mac?

Su Ubuntu se il file non esiste me lo crea altrimenti lo apre.
Su Mac invece compila ma il fd ritorna sempre -1 (sia se il file esiste già sia se non esiste e deve crearlo).
Ovviamente, se creo il file manualmente lo metto nella stessa directory e con i permessi di lettura e scrittura.
Su Mac sono costretto a usare fopen.

Mi chiedevo se magari la open funzionasse solo su Linux.

Ultima modifica effettuata da Godrek il 15/06/2019 alle 14:34
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:24
Sabato, 15/06/2019
Quanto vale errno dopo la chiamata della open?

Ovvero usa la funzione perror per dettagli

Ultima modifica effettuata da nessuno il 15/06/2019 alle 15:43


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Godrek (Normal User)
Pro


Messaggi: 76
Iscritto: 04/08/2015

Segnala al moderatore
Postato alle 20:39
Sabato, 15/06/2019
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7.  
  8. int main()
  9. {
  10.   int fd;
  11.  
  12.   if(open("./prova.txt", O_WRONLY | O_CREAT | O_TRUNC) == -1)
  13.     switch(errno)
  14.     {
  15.       case E2BIG:
  16.                   printf("Error: Arg list too long\n");
  17.                   break;
  18.       case EACCES:
  19.                   printf("Error: Permission denied\n");
  20.                   break;
  21.       case EAGAIN:
  22.                   printf("Error: Resource temporarily unavailable\n");
  23.                   break;
  24.       case EBADF:
  25.                   printf("Error: Bad file descriptor\n");
  26.                   break;
  27.     }
  28.  
  29.     write(fd,"Hello World!\n", 13);
  30.  
  31.     close(fd);
  32.  
  33.   return 0;
  34. }




Utilizzando questo codice:
- se avvio l'eseguibile dal terminale con ./nome_eseguibile mi crea un file di testo "prova.txt" vuoto (i cui permessi sono read only)
- se invece avvio l'eseguibile facendo doppio click mi da in output:
Error: Permission denied
non creando il file di testo.

Ultima modifica effettuata da Godrek il 15/06/2019 alle 20:40
PM Quote
Avatar
Godrek (Normal User)
Pro


Messaggi: 76
Iscritto: 04/08/2015

Segnala al moderatore
Postato alle 21:00
Sabato, 15/06/2019
"Risolto".
Semplicemente le funzioni open, close, write rispettano lo standard POSIX e non quello ANSI, per cui funzionano solamente su Linux.
Invece fopen, fclose e fwrite sono ANSI.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:30
Sabato, 15/06/2019
Non c'entra nulla la questione posix.

Non hai i permessi per creare il file. Prova a scrivere solo il nome del file senza indicare ./


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Godrek (Normal User)
Pro


Messaggi: 76
Iscritto: 04/08/2015

Segnala al moderatore
Postato alle 23:42
Sabato, 15/06/2019
Gia provato, e ho provato a mettere anche il percorso assoluto ma non va ugualmente.
Non funziona neanche avviando l eseguibile da terminale con sudo.
Poi la cosa a cui non so dare spiegazione è quella che il programma si comporta in un modo se avviato cliccandoci o in un altro modo se avvisto da shell.
Se fosse na roba di permessi allora non dovrebbe funzionare neanche fopen? Perche quello invece va

Ultima modifica effettuata da Godrek il 15/06/2019 alle 23:49
PM Quote