DOMANDA [C] Ciclo per una chat

Pubblicità

Chairae

Nuovo Utente
Messaggi
8
Reazioni
0
Punteggio
22
Ciao! Sto studiando i processi e avevo pensato di scrivere una sorta di chat tra parent/child, ma semplificata. Fondamentalmente figlio scrive, genitore legge / genitore scrive, figlio legge.
Qui il codice:

C:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main(){
    pid_t pid;
    char string[256];
    char readBuffer[80];
    int fd[2];

    pipe(fd);
    pid = fork();

    if(pid == -1){
        printf("Errore creating fork.\n");
        exit(1);
    }

    if(pid == 0){ //child process
        close(fd[0]);
        printf("A - Input message: ");
        fgets(string, sizeof(string), stdin);
        write(fd[1], string, (strlen(string)+1));
        exit(0);
    }else{ //parent process
        close(fd[1]);
        read(fd[0], readBuffer, sizeof(readBuffer));
        printf("A says: %s", readBuffer);
    }

    pipe(fd);
    pid = fork();

    if(pid == -1){
        printf("Errore creating fork.\n");
        exit(1);
    }

    if(pid == 0){ //child process
        close(fd[1]);
        read(fd[0], readBuffer, sizeof(readBuffer));
        printf("B says: %s", readBuffer);
    }else{ //parent process
        close(fd[0]);
        printf("B - Input message: ");
        fgets(string, sizeof(string), stdin);
        write(fd[1], string, (strlen(string)+1));
        exit(0);
    return 0;
}


e qui si pone il problema: dopo aver inviato/ricevuto il messaggio due volte, ovviamente la chat si arresta. Ho provato a mettere un while(true) / while(1) / for(; ;) / while(!=0) ma non è il modo giusto lol
Come posso scrivere un ciclo in maniera tale che la porzione di codice venga ripetuta fino a che qualcuno scrive?
 
Ultima modifica da un moderatore:
Ciao! Sto studiando i processi e avevo pensato di scrivere una sorta di chat tra parent/child, ma semplificata. Fondamentalmente figlio scrive, genitore legge / genitore scrive, figlio legge.
Qui il codice:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main(){
    pid_t pid;
    char string[256];
    char readBuffer[80];
    int fd[2];

    pipe(fd);
    pid = fork();

    if(pid == -1){
        printf("Errore creating fork.\n");
        exit(1);
    }

    if(pid == 0){ //child process
        close(fd[0]);
        printf("A - Input message: ");
        fgets(string, sizeof(string), stdin);
        write(fd[1], string, (strlen(string)+1));
        exit(0);
    }else{ //parent process
        close(fd[1]);
        read(fd[0], readBuffer, sizeof(readBuffer));
        printf("A says: %s", readBuffer);
    }

    pipe(fd);
    pid = fork();

    if(pid == -1){
        printf("Errore creating fork.\n");
        exit(1);
    }

    if(pid == 0){ //child process
        close(fd[1]);
        read(fd[0], readBuffer, sizeof(readBuffer));
        printf("B says: %s", readBuffer);
    }else{ //parent process
        close(fd[0]);
        printf("B - Input message: ");
        fgets(string, sizeof(string), stdin);
        write(fd[1], string, (strlen(string)+1));
        exit(0);
    return 0;
}


e qui si pone il problema: dopo aver inviato/ricevuto il messaggio due volte, ovviamente la chat si arresta. Ho provato a mettere un while(true) / while(1) / for(; ;) / while(!=0) ma non è il modo giusto lol
Come posso scrivere un ciclo in maniera tale che la porzione di codice venga ripetuta fino a che qualcuno scrive?
Invece il while(true) è il modo giusto. Fino a quando c'è un messaggio tutto ok, quando l'utente non digita nulla o digita, per esempio, "exit", tu fai il controllo e termini il ciclo.
Oppure potresti mettere una scelta:
1) Invia un messaggio
2) Termina chat

Esame di Sistemi Operativi? :)
 
Perché non usi una pipe che quando si legge un determinato messaggio si chiude la chat?
Ciao! Sto studiando i processi e avevo pensato di scrivere una sorta di chat tra parent/child, ma semplificata. Fondamentalmente figlio scrive, genitore legge / genitore scrive, figlio legge.
Qui il codice:

Codice:
#include 
#include 
#include types.h>
#include 
#include 

int main(){
pid_t pid;
char string[256];
char readBuffer[80];
int fd[2];

pipe(fd);
pid = fork();

if(pid == -1){
printf("Errore creating fork.\n");
exit(1);
}

if(pid == 0){ //child process
close(fd[0]);
printf("A - Input message: ");
fgets(string, sizeof(string), stdin);
write(fd[1], string, (strlen(string)+1));
exit(0);
}else{ //parent process
close(fd[1]);
read(fd[0], readBuffer, sizeof(readBuffer));
printf("A says: %s", readBuffer);
}

pipe(fd);
pid = fork();

if(pid == -1){
printf("Errore creating fork.\n");
exit(1);
}

if(pid == 0){ //child process
close(fd[1]);
read(fd[0], readBuffer, sizeof(readBuffer));
printf("B says: %s", readBuffer);
}else{ //parent process
close(fd[0]);
printf("B - Input message: ");
fgets(string, sizeof(string), stdin);
write(fd[1], string, (strlen(string)+1));
exit(0);
return 0;
}


e qui si pone il problema: dopo aver inviato/ricevuto il messaggio due volte, ovviamente la chat si arresta. Ho provato a mettere un while(true) / while(1) / for(; ;) / while(!=0) ma non è il modo giusto lol
Come posso scrivere un ciclo in maniera tale che la porzione di codice venga ripetuta fino a che qualcuno scrive?

Inviato da LG-H870 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Invece il while(true) è il modo giusto. Fino a quando c'è un messaggio tutto ok, quando l'utente non digita nulla o digita, per esempio, "exit", tu fai il controllo e termini il ciclo.
Oppure potresti mettere una scelta:
1) Invia un messaggio
2) Termina chat

Esame di Sistemi Operativi? :)

Ahimè, sì. E, come al solito, mi sono ridotta a studiare determinate cose (tutta la parte in C) all'ultimo minuto x)
Ho studiato C anni fa, ero convinta di ricordarlo ma inutile dire che non è così ahahahahah


Perché non usi una pipe che quando si legge un determinato messaggio si chiude la chat?

Inviato da LG-H870 tramite App ufficiale di Tom\'s Hardware Italia Forum

Non ho la minima idea di come scriverla, a dire la verità ahahah e poi perché dovrei chiuderla? Il problema è l'opposto, voglio tenerla sempre aperta.
 
Ahimè, sì. E, come al solito, mi sono ridotta a studiare determinate cose (tutta la parte in C) all'ultimo minuto x)
Ho studiato C anni fa, ero convinta di ricordarlo ma inutile dire che non è così ahahahahah




Non ho la minima idea di come scriverla, a dire la verità ahahah e poi perché dovrei chiuderla? Il problema è l'opposto, voglio tenerla sempre aperta.
Ok allora stranamente non vedevo il codice completo da smartphone... puoi impostare un do while in modo che ti esegua la fork almeno una volta dopodiché la read automaticamente mette in attesa il padre che in ricezione leggerà una stringa ed il tutto prosegue fino ad un EXIT_FAILURE del padre :)
 
Scusa ma questo ha ben poco a che fare con il linguaggio C, creare un altro processo (mediante fork) e avere i due processi comunicare tra loro (mediante pipe e dup) che e' un argomento tosto e limitato solo all'ambiante Unix. Che comunque non va bene nel tuo caso, in quanto una chat non funziona tra processo padre e figlio, bensi' tra due processi che girano su computer diversi.
 
Ahimè, sì. E, come al solito, mi sono ridotta a studiare determinate cose (tutta la parte in C) all'ultimo minuto x)
Ho studiato C anni fa, ero convinta di ricordarlo ma inutile dire che non è così ahahahahah




Non ho la minima idea di come scriverla, a dire la verità ahahah e poi perché dovrei chiuderla? Il problema è l'opposto, voglio tenerla sempre aperta.
Direi che il problema di quale linguaggio usare qui è davvero il minimo! Si tratta di saper pensare un semplice algoritmo!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Leggo ora @Andretti60 e condivido anche il fatto che i processi padre/figlio non hanno nulla a che vedere con il funzionamento di una chat ed in particolare con la comunicazione in tempo reale tra due utenti.. di cosa stiamo parlando?!?

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Leggo ora @Andretti60 e condivido anche il fatto che i processi padre/figlio non hanno nulla a che vedere con il funzionamento di una chat ed in particolare con la comunicazione in tempo reale tra due utenti.. di cosa stiamo parlando?!?

Inviato dal mio Nexus 6P utilizzando Tapatalk
@Andretti60 @rctimelines credo voglia un semplice esercizio per imparare a gestire le fork e le pipe. La chat è solo un modo per rendere più "interessante" questo esercizio
 
Ragazzi ... non voglio scrivere una vera e propria chat ahahahah volevo solo rendere la scrittura/lettura di messaggio un po' più interessante. Magari chiedete prima di sentenziare la prossima volta e di agitarvi x'
L'esercizio base era di inviare un valore intero da padre a figlio, ho cambiato le cose per vedere un po' come funzionano fork() e pipe(), tutto qui.
Ad ogni modo grazie @ilfe98, domani provo e ti faccio sapere!
 
Ragazzi ... non voglio scrivere una vera e propria chat ahahahah volevo solo rendere la scrittura/lettura di messaggio un po' più interessante. Magari chiedete prima di sentenziare la prossima volta e di agitarvi x'
E chi si agita scusa? Hai fatto una domanda, ti abbiamo risposto, facendo notare quello che a noi sembrava strano. Tutto qui. Rispondiamo solo perche' ci piace aiutare, mica siamo pagati. E non abbiamo una palla magica... almeno la mia al momento e' in riparazione a Diagon Alley. Ti rispondero' appena ritorna.
 
Nel titolo si legge "ciclo per una chat".. a parte al fatto che non è nemmeno un "ciclo" perché ti è stato suggerito di introdurne uno e lo hai pure messo in dubbio, ma allora il titolo va cambiato, che ne so: "utilizzo dei processi in C"? L'idea della chat non rende la cosa più interessante, ma crea confusione perché non è attinente.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Ragazzi ... non voglio scrivere una vera e propria chat ahahahah volevo solo rendere la scrittura/lettura di messaggio un po' più interessante. Magari chiedete prima di sentenziare la prossima volta e di agitarvi x'
L'esercizio base era di inviare un valore intero da padre a figlio, ho cambiato le cose per vedere un po' come funzionano fork() e pipe(), tutto qui.
Ad ogni modo grazie @ilfe98, domani provo e ti faccio sapere!
Ciao, mi fa piacere che ti sia stato d'aiuto. Comunque posso affermare con certezza che gli utenti Andretti e timelines hanno risposto con una valutazione oggettiva dovuta alla loro esperienza. Sono entrambi degli utenti che sanno molto e hanno molto da dare. Io sono uno studente universitario ed ho compreso subito cosa volessi. Il titolo purtroppo inganna chi ha esperienza nel settore in quanto a te può sembrare complicato da programmare una chat, per loro è un compito come un'altro. Non ti hanno sentenziato, purtroppo le parole a volte non bastano ed è un grande limite,per noi informatici esprimerci soggettivamente diventa sempre complicato con il tempo tendiamo a diventare molto precisi. Comunque noto che sei un nuovo utente. Benvenuto/a su Tom's hardware

Inviato da LG-H870 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Pubblicità
Pubblicità
Indietro
Top