[Sistemi Operativi, C] Processi

Messaggioda Xemitron » 22/06/2020, 22:07

Salve, dovrei scrivere un programma C in cui un padre genera 4 figli, di cui 3 fanno la stessa cosa e ognuno dei tre comunica in un modo diverso con il quarto fratello(tipo il primo tramite socket, il secondo con pipe, il terzo con memoria condivisa).

Io starei lavorando in questo modo:

pid_t pid[4]

for(int i=0;i<4;i++){
if(pid[i]=fork()==0){
// produce risultato
if(i==0){
// comunica risultato tramite socket
}
if(i==1){
// comunica risutato con pipe
}
if(i==2){
// comunica risultato con memoria condivisa
}
if(i==3){
// riceve messaggi dai tre processi e ci fa qualcosa
}
}
}


Ecco, non sono sceso nei particolari del programma, ma più o meno può andar bene una struttura del genere? Perchè ho qualche dubbio...
Xemitron
Starting Member
Starting Member
 
Messaggio: 3 di 30
Iscritto il: 15/01/2018, 16:20

Re: [Sistemi Operativi, C] Processi

Messaggioda apatriarca » 23/06/2020, 10:10

Scrivere un ciclo per poi scomporre il comportamento per ogni iterazione mi sembra un po' inutile. Ha più senso avere qualcosa tipo:
Codice:
if (pid[0] == fork() == 0) {
    // figlio 1
}

if (pid[1] == fork() == 0) {
    // figlio 2
}

if (pid[2] == fork() == 0) {
    // figlio 3
}

if (pid[3] == fork() == 0) {
    // figlio 4
}
apatriarca
Moderatore
Moderatore
 
Messaggio: 5451 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Sistemi Operativi, C] Processi

Messaggioda Xemitron » 23/06/2020, 10:37

(Ovviamente nella condizione di ogni if il primo operatore è un assegnamento, non l’uguaglianza, giusto?)

Comunque in questo caso dovrei ripetere lo stesso codice per tutti gli if, cioè per tutti i figli, eccetto il modo con cui comunicano col quarto fratello?
Xemitron
Starting Member
Starting Member
 
Messaggio: 4 di 30
Iscritto il: 15/01/2018, 16:20

Re: [Sistemi Operativi, C] Processi

Messaggioda apatriarca » 23/06/2020, 10:47

Certo, il primo operatore avrebbe dovuto essere l'assegnamento ma l'ho scritto un po' di fretta. Per il codice comune puoi usare una o più funzioni per rimuovere la duplicazione del codice.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5452 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Sistemi Operativi, C] Processi

Messaggioda Xemitron » 30/07/2020, 19:21

Salve, innanzitutto grazie per le risposte e mi scuso per il ritardo con cui ritorno qui ma sono stato impegnato con altro. Ritornando al mio problema di inizio post, spiego meglio cosa dovrebbe fare... Ognuno dei primi tre processi una volta al secondo deve leggere una riga da un file e inviarla secondo la sua modalità al quarto. E' giusto pensarla così?

Codice:
for(int i=0;i<4;i++){
      pid[i]=fork();
   }

while(fgets...!=null){
        if(pid[0]==0){
                 sleep(1)
                 // comunica con socket la riga
        }
        if(pid[1]==0){
                 sleep(1)
                // comunica con pipe la riga
        }
        if(pid[2]==0){
                sleep(1)
                // comunica con memoria condivisa
        }
        if(pid[3]==0){
                sleep(1)
                // riceve in ordine con socket, pipe e memoria
        }
}


Oppure ogni processo dovrebbe avere il ciclo per scandire il file al suo interno?
Xemitron
Starting Member
Starting Member
 
Messaggio: 5 di 30
Iscritto il: 15/01/2018, 16:20

Re: [Sistemi Operativi, C] Processi

Messaggioda apatriarca » 30/07/2020, 20:04

Rileggendo la discussione mi rendo conto di come abbia risposto un po' di fretta. Il tuo modo di generare i figli non è corretto. Stai infatti generando molti più figli di quanto pensi. La prima iterazione del ciclo viene eseguita una sola volta, ma la seconda viene eseguita da due processi, la terza da quattro e la quarta da otto. È quindi necessario assicurarsi che il fork sia lanciato dal solo primo processo. Un modo è il seguente:
Codice:
if (pid[0] = fork() == 0) {
    // codice per il primo figlio
} else if (pid[1] = fork() == 0) {
    // codice per il secondo figlio
} else if (pid[2] = fork() == 0) {
    // codice per il terzo figlio
} else if (pid[2] = fork() == 0) {
    // codice per il quarto figlio
} else {
    // codice per il processo padre
}

Volendo usare un ciclo puoi fare qualcosa come segue:
Codice:
int child_id = -1;
for (int i = 0; i < 4; ++i) {
    pid[i] = fork();
    if (pid[i] == 0) {  // se è il figlio
        child_id = i;
        break;  // esco dal ciclo così solo il padre chiamerà il fork successivo
    }
}

// qui puoi scrivere il test basato su child_id uguale a 0, 1, 2 o 3
apatriarca
Moderatore
Moderatore
 
Messaggio: 5464 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Sistemi Operativi, C] Processi

Messaggioda Xemitron » 30/07/2020, 22:13

Capito. Per quanto riguarda l’altro dubbio... Dato che ogni processo deve scandire un file e comunicare riga per riga una volta al secondo, quindi userei un ciclo while, dovrei inserirlo nel codice di ogni processo oppure posso inserire i test dei vari figli in un unico ciclo?
Xemitron
Starting Member
Starting Member
 
Messaggio: 6 di 30
Iscritto il: 15/01/2018, 16:20

Re: [Sistemi Operativi, C] Processi

Messaggioda apatriarca » 31/07/2020, 12:06

Se usi il secondo metodo descritto puoi usare un singolo ciclo, se no devi avere 4 cicli separati.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5465 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite