RISOLTO [C] Problema con redirezione da standard output

Stato
Discussione chiusa ad ulteriori risposte.

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Salve, non riesco a risolvere un problema con la riderezione da standard output, mi trovo su sistema operativo Unix, quindi il file-descriptor di STD_IN = 0, STD_OUT = 1, STD_ERR = 2, in pratica ho provato a chiudere il descrittore associato allo standard output, per poi sovrascriverlo con quello del file in cui voglio scrivere, ma quando apro il file è vuoto.
CODICE:
C:
/* gestione primitive basso livello*/
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
/*special file's descriptor  --use it or constants in unistd.h-- */
#define STD_IN 0 /*standard input stream*/
#define STD_OUT 1 /*standard output stream*/
#define STD_ERR 2 /*standard output-error stream*/

int main(unsigned int num_of_args, char** args)
{
    if(num_of_args != 3)
    {
        write(STD_ERR, "Few argouments.\nThe use  = ./executable <message> <file>\n", 69);
        return -1;
    }

    int file_des= open(args[2],  O_CREAT,  0640);

    if(file_des < 0)
    {
        write(STD_ERR, "Error, we couldn't open file.\n", 31);
        return -1;
    }

    //chiudo il descrittore associato a STD_OUT
    close(STD_OUT);

    //copio il descrittore associato a fil_des sul primo descrittore disponibile(quindi STD_OUT)
    dup(file_des);

    write(STD_OUT, args[1], sizeof(args[1]));

    close(file_des);

    return 0;
}
Dovrebbe andare tutto bene, non vedo errori, però quando apro il file non trovo scritto il messaggio.
Perchè? help me
 
Ultima modifica:

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Salve, non riesco a risolvere un problema con la riderezione da standard output, mi trovo su sistema operativo Unix, quindi il file-descriptor di STD_IN = 0, STD_OUT = 1, STD_ERR = 2, in pratica ho provato a chiudere il descrittore associato allo standard output, per poi sovrascriverlo con quello del file in cui voglio scrivere, ma quando apro il file è vuoto.
CODICE:
C:
/* gestione primitive basso livello*/
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
/*special file's descriptor  --use it or constants in unistd.h-- */
#define STD_IN 0 /*standard input stream*/
#define STD_OUT 1 /*standard output stream*/
#define STD_ERR 2 /*standard output-error stream*/

int main(unsigned int num_of_args, char** args)
{
    if(num_of_args != 3)
    {
        write(STD_ERR, "Few argouments.\nThe use  = ./executable <message> <file>\n", 69);
        return -1;
    }

    int file_des= open(args[2],  O_CREAT,  0640);

    if(file_des < 0)
    {
        write(STD_ERR, "Error, we couldn't open file.\n", 31);
        return -1;
    }

    //chiudo il descrittore associato a STD_OUT
    close(STD_OUT);

    //copio il descrittore associato a fil_des sul primo descrittore disponibile(quindi STD_OUT)
    dup(file_des);

    write(STD_OUT, args[1], sizeof(args[1]));

    close(file_des);

    return 0;
}
Dovrebbe andare tutto bene, non vedo errori, però quando apro il file non trovo scritto il messaggio.
Perchè? help me
Aggiornamento: mi sono appena accorto che anche chiamando la funzione write sul file descriptor di un file non mi scrive niente(file descriptor assegnato a un file precedentemente tramite la funzione open)
 

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Aggiornamento: mi sono appena accorto che anche chiamando la funzione write sul file descriptor di un file non mi scrive niente(file descriptor assegnato a un file precedentemente tramite la funzione open)
un aiutino signori, e da due giorni che non riesco a risolvere : (
 
Ultima modifica da un moderatore:

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Maybe?

devo usare solo le primitive(systemcall), il problema e che la write non funziona, ho provato su un secondo programma ma non mi scrive niente neanche su STD_OUT
Post unito automaticamente:

devo usare solo le primitive(systemcall), il problema e che la write non funziona, ho provato su un secondo programma ma non mi scrive niente neanche su STD_OUT
niente funzioni tipo redir ecc... ma solo write, read, open, close e dup
 

pabloski

Utente Èlite
2,868
916
Ahi ahi ahi....

Codice:
    int file_des= open(args[2],  O_CREAT,  0640);

WRONG!!!

Codice:
    int file_des= open(args[2],  O_RDWR | O_CREAT,  0640);

oppure

Codice:
    int file_des= open(args[2],  O_WRONLY | O_CREAT,  0640);

il punto è che l'access mode è obbligatorio, non facoltativo
 
  • Mi piace
Reazioni: Matteo34

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Ahi ahi ahi....

Codice:
    int file_des= open(args[2],  O_CREAT,  0640);

WRONG!!!

Codice:
    int file_des= open(args[2],  O_RDWR | O_CREAT,  0640);

oppure

Codice:
    int file_des= open(args[2],  O_WRONLY | O_CREAT,  0640);

il punto è che l'access mode è obbligatorio, non facoltativo
non ho capito con:
C:
int file_des = open(args[2], O_CREAT, 0640);
sto associando un file descriptor a un file, per quale motivo non è corretto, con O_CREATE lo creo, e con 0640 decido i permessi.
Non è uguale a fare:
C:
int file_des= open(args[2],  O_RDWR | O_CREAT,  0640);
 

pabloski

Utente Èlite
2,868
916
non ho capito con:
C:
int file_des = open(args[2], O_CREAT, 0640);
sto associando un file descriptor a un file, per quale motivo non è corretto, con O_CREATE lo creo, e con 0640 decido i permessi.
Non è uguale a fare:
C:
int file_des= open(args[2],  O_RDWR | O_CREAT,  0640);

Ma non stai dicendo cosa ci vuoi fare. Un file non basta aprirlo/crearlo, bisogna pure specificarne la modalità d'accesso.
 

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Ma non stai dicendo cosa ci vuoi fare. Un file non basta aprirlo/crearlo, bisogna pure specificarne la modalità d'accesso.
Non le ho specificate con 0640? lettura è scrittura per il possessore del file, lettura per il gruppo e nessun permesso per chi non c'entra nulla con il file
 

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Ma non stai dicendo cosa ci vuoi fare. Un file non basta aprirlo/crearlo, bisogna pure specificarne la modalità d'accesso.
inoltre quando creo il file, mi crea un file binario e quindi non posso aprirlo come posso risolvere? Se vedo le proprietà del file, occupa 5byte, il numero esatto di byte che ho scritto, il problema che essendo binario non me lo fa aprire
 

pabloski

Utente Èlite
2,868
916
Non le ho specificate con 0640? lettura è scrittura per il possessore del file, lettura per il gruppo e nessun permesso per chi non c'entra nulla con il file

No, quelli sono i permessi d'accesso, non la modalità. Puoi guardare il man per open e vedrai che c'è scritto che è obbligatorio specificare l'access mode.
Post unito automaticamente:

inoltre quando creo il file, mi crea un file binario e quindi non posso aprirlo come posso risolvere? Se vedo le proprietà del file, occupa 5byte, il numero esatto di byte che ho scritto, il problema che essendo binario non me lo fa aprire

open opera su file binari, non ha nessun meccanismo di buffering, nè di formattazione

inoltre open è una funzione POSIX, che potrebbe essere presente o meno sul sistema operativo target, mentre fopen è la funzione standard del C e fa differenza tra file binari e file di testo
 
Ultima modifica:

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
No, quelli sono i permessi d'accesso, non la modalità. Puoi guardare il man per open e vedrai che c'è scritto che è obbligatorio specificare l'access mode.
Post unito automaticamente:



open opera su file binari, non ha nessun meccanismo di buffering, nè di formattazione

inoltre open è una funzione POSIX, che potrebbe essere presente o meno sul sistema operativo target, mentre fopen è la funzione standard del C e fa differenza tra file binari e file di testo
Si, il fatto è che alcune volte me lo crea binario, altre volte di testo, ho notato che cambia in base alla modalità di apertura del file
 

pabloski

Utente Èlite
2,868
916
Si, il fatto è che alcune volte me lo crea binario, altre volte di testo, ho notato che cambia in base alla modalità di apertura del file

binario vuol semplicemente dire che la funzione manda allo stream i byte così come sono, senza nessuna formattazione/interpretazione/conversione

per esempio scrive il numero di byte che gli dici di scrivere, fregandosene del terminatore per le stringhe
 

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
binario vuol semplicemente dire che la funzione manda allo stream i byte così come sono, senza nessuna formattazione/interpretazione/conversione

per esempio scrive il numero di byte che gli dici di scrivere, fregandosene del terminatore per le stringhe
A me il file non me lo fa proprio aprire, quando chiamo la open certe volte mi crea un file binario(che non mi fa aprire, sulle priorità del file c'è scritto "binario") e altre volte un file normale(che mi fa aprire, sulle proprietà del file c'è scritto "file di testo .text)
 

pabloski

Utente Èlite
2,868
916
Ma questo è un problema del file manager e/o dell'editor usato. Se vai da terminale e usi vim o nano, vedrai che te lo apre in ogni caso.
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!