Discussione Ufficiale Programmiamo con Inforge | Esercitazione 03 in C | Livello intermedio

Una Discussione Ufficiale punta a raccogliere tutte le informazioni su un argomento o un fatto di attualità, con costanti aggiornamenti da parte del creatore e dei partecipanti.

Not an engineer

Moderatore
31 Ottobre 2011
2,547
100
1,141
1,089
Ultima modifica:
main.png


Programmiamo con Inforge | Presentazione

Ad oggi, sul web, si trovano moltissime guide sui vari linguaggi di programmazione e sulle loro molteplici applicazioni. Tuttavia, chi si approccia a queste risorse, non sempre riesce a mettere in pratica ciò che ha appreso. Al fine di limitare queste mancanze, nasce Programmiamo con Inforge.

In questa rubrica potrai scrivere codice per la risoluzione di alcuni problemi legati alla programmazione, mettendo in pratica quanto stai apprendendo dalla teoria oppure mostrando le tue abilità e competenze nel campo dell’informatica.


Partiamo dalle basi del C

In questa guida puoi trovare i testi per studiare e approfondire il C: I migliori libri per imparare e approfondire il C
In questa discussione puoi trovare le risposte alle domande più frequenti su come scrivere codice in C: Frequently asked questions: da dove si parte?


Esercitazione 03 in C | Livello intermedio | [Programmazione concorrente]

La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi o sotto-processi sia in esecuzione nello stesso istante (un'importante classe di sistemi informatici nei quali gli aspetti di concorrenza sono fondamentali è quella dei sistemi operativi)
L'esercitazione si compone di 5 esercizi nei quali ti sarà richiesto di compiere delle operazioni base su thread e processi mediante l'utilizzo di funzioni come pid() e fork()




Soluzioni

Per rendere l'esercitazione più interessante, non verrà pubblicata alcuna soluzione! Spetterà a te scrivere la tua versione del codice e pubblicarla in questo thread così che possa essere valutata dai moderatori e dalla community; il modo migliore per imparare!

Conclusioni

Pubblica la soluzione ottimale per risolvere gli esercizi e ricorda che puoi confrontarti con il resto della community in questo thread, chiedere aiuto o aiutare gli altri ;)
 

Sax3r28

Utente Gold
8 Aprile 2016
721
10
397
241
Provato i primi 2 unicamente seguendo una mia "logica" dato che dalle documentazioni non ho capito niente, ste cose mi pare che ce le fecero provare su linux e non avendolo disponibile al momento, non so cos'altro potrei usare. Non funzionerebbero lo stesso in ogni caso :rofl:

Codice:
E1
{
    pid_t pid1;
    pid1 = fork();

    if (pid1 < 0)
    {
      printf("\nFork non riuscito");
    }
    else if (pid1 == 0)
    {
        printf("\nPid processo figlio: %d",getpid());
        printf("\nPid processo padre: %d",getppid());
    }  
}

E2
{
    pid_t pid1, pid2;
    pid1 = fork();
  
    if(pid1<0)
    {
        printf("\nFork non riuscito");
    }
    else if (pid1 == 0)
    {
        printf("\nPid processo figlio: %d",getpid());
        printf("\nPid processo padre: %d",getppid());
        kill(getpid(), SIGKILL);
    }  
  
    pid2 = fork();
  
    if(pid2<0)
    {
        printf("\nFork non riuscito");
    }
    else if (pid2 == 0)
    {
        printf("\nPid processo figlio: %d",getpid());
        printf("\nPid processo padre: %d",getppid());
        kill(getpid(), SIGKILL);
    }
 

Not an engineer

Moderatore
31 Ottobre 2011
2,547
100
1,141
1,089
@Sax3r28
Mi sembra abbastanza corretto, non male!

Piccoli consigli per il primo esercizio
  • Prima di chiamare getpid() anteponi (int)getpid();

  • Dopo l'else-if manda a dormire il processo con sleep() o simili.
 

Sax3r28

Utente Gold
8 Aprile 2016
721
10
397
241
Ultima modifica:
@Sax3r28
Mi sembra abbastanza corretto, non male!

Piccoli consigli per il primo esercizio
  • Prima di chiamare getpid() anteponi (int)getpid();

  • Dopo l'else-if manda a dormire il processo con sleep() o simili.
Mettere int vale anche per getppid?
Sleep invece cosa dovrebbe fare di necessario? Non ritarda solo l'esecuzione?
E in caso se c'è un modo migliore per terminare un figlio :V non sapevo in che altro modo evitare che i figli ne creassero due a loro volta e li ho sterminati direttamente.
Per gli altri 3 esercizi, non so come e dove "inviare" un valore al padre e come/dove prendere questo valore. Sto leggendo cose su pipe() che mi pare serva a fare ciò (?)

Mentre mi leggo su ste pipe ti lascio una domanda: usando lo sleep() posso fare in modo che il figlio invii un sizeof() al padre e va in sleep, poi il padre salva il sizeof in una variabile, va in sleep, torno al figlio che invia il pid, lo termino e con il padre stampo quello che devo stampare? O il size di un int dichiarato è uguale a uno non dichiarato e quindi mi basta inviare solo il pid?
 

Sax3r28

Utente Gold
8 Aprile 2016
721
10
397
241
Unisco tutti i codici così si fa prima, stessa premessa sugli ultimi 3 ovvero non so come provarli e non penso di aver capito ancora tutto perfettamente.

Codice:
ES1
{
    pid_t pid1;
    pid1 = fork();

    if (pid1 < 0)
    {
      printf("\nFork non riuscito");
    }
    else if (pid1 == 0)
    {
        printf("\nPid processo figlio: %d",getpid());
        printf("\nPid processo padre: %d",getppid());
    }
}

ES2
{
    pid_t pid1, pid2;
    pid1 = fork();

    if(pid1<0)
    {
        printf("\nFork non riuscito");
    }
    else if (pid1 == 0)
    {
        printf("\nPid processo figlio: %d",getpid());
        printf("\nPid processo padre: %d",getppid());
        kill(getpid(), SIGKILL);
    }

    pid2 = fork();

    if(pid2<0)
    {
        printf("\nFork non riuscito");
    }
    else if (pid2 == 0)
    {
        printf("\nPid processo figlio: %d",getpid());
        printf("\nPid processo padre: %d",getppid());
        kill(getpid(), SIGKILL);
    }
}

ES3
{
    pid_t pid1;
    int pip1[2];
    pid1 = fork();
  

    if (pid1 < 0)
    {
      printf("\nFork non riuscito");
    }
    else if (pid1 == 0)
    {              
        close(fd[0]);
        int Rpipe;
        read(fd[0], Rpipe, (int)sizeof(Rpipe));  
        printf("\nPadre stampa PID figlio: %d",Rpipe);  
    }  
    else
    {          
        int pidF=(int)getpid();      
        write(fd1[1], pidF, (int)sizeof(pidF));  
        close(fd1[1]);
        kill((int)getpid(), SIGKILL);      
    }  
}

ES4
{
    pid_t pid1;
    int pip1[2];
    pid1 = fork();
  

    if (pid1 < 0)
    {
      printf("\nFork non riuscito");
    }
    else if (pid1 == 0)
    {              
        int Rpipe;
        read(fd[0], Rpipe, (int)sizeof(Rpipe));  
        printf("\nrand() restituisce: %d",Rpipe);  
    }  
    else
    {          
        int randF= rand() % 201;      
        write(fd1[1], randF, (int)sizeof(pidF));  
        close(fd1[1]);
        kill((int)getpid(), SIGKILL);      
    }      
}

ES5
{
    pid_t pid1, pid2;
    int pip1[2];
    int val=0;  
    pid1 = fork();
  
    if(pid1<0)
    {
        printf("\nFork non riuscito");
    }
    else if (pid1 == 0) //figlio1
    {
        printf("\nInserisci 0<valore<100: ");
        scanf("%d",&val);
        write(fd1[1], val, (int)sizeof(val));
        printf("\nFiglio1 invia valore a processo padre");
        close(fd1[1]);
        kill((int)getpid(), SIGKILL);
      
    }  
    else
    {
        int Ppipe;
        read(fd[0], Ppipe, (int)sizeof(Ppipe));  
        close(fd[0]);
        write(fd1[1], Ppipe, (int)sizeof(Ppipe));
        printf("\nPadre invia valore a figlio2");
        close(fd[1]);
        kill((int)getpid(), SIGKILL);
    }
  
    pid2 = fork();
  
    if(pid2<0)
    {
        printf("\nFork non riuscito");
    }
    else if (pid2 == 0) //figlio2
    {
        int Fpipe;
        read(fd[0], Fpipe, (int)sizeof(Fpipe));
        printf("\nFiglio2 stampa valore: %d",Fpipe);
        close(fd[0]);
      
    }  
}
 

Not an engineer

Moderatore
31 Ottobre 2011
2,547
100
1,141
1,089
@Sax3r28

Con sleep() hai la possibilità di sospendere il processo e di compiere altre operazioni. Non è una funziona necessaria per la risoluzione dei primi due esercizi: puoi terminare il processo e l'esecuzione del programma utilizzando exit()
Corretta l'idea di utilizzare la pipe() e la sua realizzazione con il buffer.

Per provare il tutto ti basta scrivere il programma importando le giuste librerie.

C:
// librerie utili
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(){
/*
codice
*/
return 0;
}
 

Sax3r28

Utente Gold
8 Aprile 2016
721
10
397
241
Ultima modifica:
Suppongo che devcpp sia troppo basico per fare certe cose allora :asd: oggi avevo provato con stdio e unistd il primo, non mi faceva usare fork e getppid.

Riguardo la domanda invece? Va "bene" come l'ho scritto o c'è un altro modo, tipo quello qua sotto?
Usando lo sleep() posso fare in modo che il figlio invii un sizeof() al padre e va in sleep, poi il padre salva il sizeof in una variabile, va in sleep, torno al figlio che invia il pid, lo termino e con il padre stampo quello che devo stampare? O il size di un int dichiarato è uguale a uno non dichiarato e quindi mi basta inviare solo il pid?
 

Not an engineer

Moderatore
31 Ottobre 2011
2,547
100
1,141
1,089
Puoi farlo, ma è una soluzione ad alto rischio d'errore vista la gestione dei tempi e l'eventuale utilizzo dei signal. Comunque va benissimo mandare solo il pid!
 
  • Mi piace
Reazioni: Valley

satchel000

Utente Iron
28 Marzo 2021
2
0
1
7
Visualizza allegato 51209

Programmiamo con Inforge | Presentazione

Ad oggi, sul web, si trovano moltissime guide sui vari linguaggi di programmazione e sulle loro molteplici applicazioni. Tuttavia, chi si approccia a queste risorse, non sempre riesce a mettere in pratica ciò che ha appreso. Al fine di limitare queste mancanze, nasce Programmiamo con Inforge.

In questa rubrica potrai scrivere codice per la risoluzione di alcuni problemi legati alla programmazione, mettendo in pratica quanto stai apprendendo dalla teoria oppure mostrando le tue abilità e competenze nel campo dell’informatica.


Partiamo dalle basi del C

In questa guida puoi trovare i testi per studiare e approfondire il C: I migliori libri per imparare e approfondire il C
In questa discussione puoi trovare le risposte alle domande più frequenti su come scrivere codice in C: Frequently asked questions: da dove si parte?


Esercitazione 03 in C | Livello intermedio | [Programmazione concorrente]

La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi o sotto-processi sia in esecuzione nello stesso istante (un'importante classe di sistemi informatici nei quali gli aspetti di concorrenza sono fondamentali è quella dei sistemi operativi)
L'esercitazione si compone di 5 esercizi nei quali ti sarà richiesto di compiere delle operazioni base su thread e processi mediante l'utilizzo di funzioni come pid() e fork()


*** Hidden text: cannot be quoted. ***


Soluzioni

Per rendere l'esercitazione più interessante, non verrà pubblicata alcuna soluzione! Spetterà a te scrivere la tua versione del codice e pubblicarla in questo thread così che possa essere valutata dai moderatori e dalla community; il modo migliore per imparare!

Conclusioni

Pubblica la soluzione ottimale per risolvere gli esercizi e ricorda che puoi confrontarti con il resto della community in questo thread, chiedere aiuto o aiutare gli altri ;)
Grazie per il vostro lavoro!
Messaggio unito automaticamente:

Grazie!