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,302
881
620
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 ;)
 
DOWNLOAD
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker
DOWNLOAD
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker

Sax3r28

Utente Gold
8 Aprile 2016
625
310
248
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);
    }
 
DOWNLOAD

Not an engineer

Moderatore
31 Ottobre 2011
2,302
881
620
@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
625
310
248
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?
 
DOWNLOAD