Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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: 74
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: 6196
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: 74
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: 74
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: 6196
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: 74
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