Benvenuto su Inforge
Rimuovi la pubblicità e partecipa alla più grande comunità italiana sul mondo digitale presente sul web sin dal 2007.
Iscriviti

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.

Sax3r28

Utente Gold
8 Aprile 2016
570
278
218
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,448
754
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.
 
Supporta Inforge con una donazione

Sax3r28

Utente Gold
8 Aprile 2016
570
278
218
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?
 
Supporta Inforge con una donazione

Sax3r28

Utente Gold
8 Aprile 2016
570
278
218
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,448
754
620
@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
570
278
218
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?
 
Supporta Inforge con una donazione