DOMANDA [C] Ciclo per una chat

Chairae

Nuovo Utente
8
0
CPU
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
RAM
16,0 GB
GPU
NVIDIA GeForce GTX 1070 with Max-Q Design
OS
Windows 10
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:

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
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? :)
 
  • Mi piace
Reazioni: Chairae

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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
 

Chairae

Nuovo Utente
8
0
CPU
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
RAM
16,0 GB
GPU
NVIDIA GeForce GTX 1070 with Max-Q Design
OS
Windows 10
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.
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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 :)
 
  • Mi piace
Reazioni: Chairae

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: rctimelines

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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
 

Chairae

Nuovo Utente
8
0
CPU
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
RAM
16,0 GB
GPU
NVIDIA GeForce GTX 1070 with Max-Q Design
OS
Windows 10
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!
 

Andretti60

Utente Èlite
6,440
5,091
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.
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

ilfe98

Moderatore
Staff Forum
Utente Èlite
3,052
1,278
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
HDD
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
GPU
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
PSU
Corsair HX750
Case
Itek lunar 23
Net
Tiscali ftth
OS
windows 10,mint,debian,Arch linux
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
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili