Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] - Creazione di processi

    Ciao a tutti, questa è la prima volta che scrivo in qst forum.

    Qualcuno puo darmi una mano?

    Il mio problema è quello di creare un programma main che generi N processi, ogn'uno dei quali deve "correre" per 10 secondi (va bene la funzione sleep()) e, passato questo tempo, deve stampare un messaggio del tipo "sono il processo numero x e sono terminato".

    Il programma main deve poi stampare la "classifica" con gli identificativi dei primi tre processi terminati prima di terminare esso stesso.

    Sono ai primi passi con questo tipo di programmazione e i vostri sugg. mi sarebbero davv. utili...
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Premetto che anch'io sono alle prime armi con i processi. Per creare un nuovo processo si usa la funzione fork che crea un nuovo processo identico a quello corrente, e ritorna zero nel processo figlio appena creato, mentre ritorna il pid identificativo del figlio nel processo padre. Analizzando il valore restituito dalla fork si puo quindi capire se siamo nel processo padre o nel filgio, esegunedo istruzioni diverse nei due casi. L'impostazione generale del programma è questa:

    Codice PHP:
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>


    for(int i 010i++){
       
    //genero un nuovo processo figlio
       
    pid fork();
       
    //se fork restituisce -1 c'è stato un errore ed esco
       
    if(pid == -1)
          exit();
        
    //se pid == 0 sono il filgio, quindi esco dal for
        
    if(pid == 0)
          break;
    }
    //se sono un processo figlio mi fermo per 10 secondi (non so come funzioni la sleep!)
    if(pid == 0){
        
    sleep(10);
        
    printf("blah clah blah");
    }
    //Se sono il padre...
    else{
       
    aspetto laterminazione di tutti i figli
       stampo la classifica
    ...

    In questo modo crei dei processi indipendenti e del tutto asincronizzati; per sapere poi chi è che ha terminato prima e chi dopo dovresti stabilire una forma di comunicazione tra il processo padre e il processo filgio, in modo che il figlio possa comunicare al padre che è terminato; questo penso si potrebbe fare utilizzando una pipe tra il padre e ogni filio, e il figlio scrive nella pipe il tempo in millisecondi in cui termina, o utilizzando una sezione di menmria condivisa (cosa piu complessa), oppure ogni figlio scrive in un file il tempo di teminazione. Se devi fare in modo che il padre aspetti la terminazione di tutti i figli, dovresti usare la funzione

    waitpid(pid, NULL, 0);

    per attendere la terminazione del processo che ha il pid specificato; tu devi attendere la terminazione di ogni processo, quindi dovresti memorizzarti in un array tutti i pid prodotti dalla fork, e poi invocare waitpid() per ognuno di essi in un ciclo for per esempio; non so se ci sono funzioni che ti permettono di aspettare direttamente la terminazione di tutti i figli esistenti senza dover specificare tu i pid.


  3. #3
    Ho fatto così:

    Codice PHP:
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    void main(void)
    {
     
    int i;
     
    pid_t pid[10];
     for(
    010i++)
     {
     
    //genero un nuovo processo figlio
      
    pid[i] = fork();
     
    //se fork restituisce -1 c'è stato un errore ed esco
      
    if(pid[i] == -1)
       exit();
     
    //se pid == 0 sono il filgio, quindi esco dal for
      
    if(pid[i] == 0)
       break;
     }
     
    //se sono un processo figlio mi fermo per 10 secondi
     
    if(pid[i] == 0)
     {
      
    sleep(1);
      
    printf("Sono il processo numero %d con pid %d\n",i+1,getpid);
     }
     
    //Se sono il padre...
     
    else
     {
      
    // aspetto la terminazione di tutti i figli
      
    for(010i++)
       
    waitpid(pid[i],NULL,0);
      
    // stampo la classifica...
      
    printf("Sono il processo padre\n");
     }

    ma non capisco perchè il pid dei 10 figli è sempre uguale (come se fosse sempre lo stesso figlio...).

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    cos'è getpid?

  5. #5
    è una funzione che restituisce il PID del processo chiamante. Cmq ora sto a :
    Codice PHP:
    #include<stdlib.h>
    #include<stdio.h>
    #include<unistd.h>
    int main(void)
    {
     
    int n,i,stato;
     
    pid_t pidvettore[20];
     
    printf("Inserire N:");
     
    scanf("%d",&n);
     for(
    i=0;i<n;i++)
     {
      
    pid fork();
      if(
    pid == 0)
      {
       
    sleep(10);
       exit(
    0);
      }
      else
       
    vettore[i] = waitpid(0,&stato,0);
     }
     for(
    i=0;i<3;i++)
      
    printf("%d classificato Processo %d\n",i+1,vettore[i]);
     
    printf("\nProcesso padre terminato\n");
     return 
    0;

    Non dovrei esserci nemmeno tanto lontano, il problema è che mi stampa la classifica sempre ordinata (in pratica mi sa che i processi non sono creati asincronamente come volevo...).

    L'errore dovrebbe essere o nella waitpid o in quell'exit(0), ma non so come modificare...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.