informatica:sol:laboratorio15:esercitazionia:scexamples

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
informatica:sol:laboratorio15:esercitazionia:scexamples [26/04/2015 alle 09:48 (10 anni fa)] – [command.c] Massimo Torquatiinformatica:sol:laboratorio15:esercitazionia:scexamples [26/04/2015 alle 13:34 (10 anni fa)] (versione attuale) – [command.c (chiamate: fork, wait, getpid, execvp)] Massimo Torquati
Linea 112: Linea 112:
 </code> </code>
  
-==== pipe2proc.c ====+==== zombie.c (chiamate: fork, waitpid, getpid, execlp) ==== 
 + 
 +Il seguente programma crea un numero di processi ''zombie'' mostrando il loro stato con il comando unix 'ps'
 + 
 +<code> 
 +#include <stdio.h> 
 +#include <unistd.h> 
 +#include <stdlib.h> 
 +#include <errno.h> 
 +#include <sys/wait.h> 
 + 
 +// utility macro 
 +#define SYSCALL(r,c,e) \ 
 +    if((r=c)==-1) { perror(e);exit(errno);
 + 
 +int main(int argc, char * argv[]) { 
 +    const int SEC=2; 
 + 
 +    if (argc != 2) { 
 + fprintf(stderr, "usa: %s num-proc\n", argv[0]); 
 + return EXIT_FAILURE; 
 +    } 
 +     
 +    int nproc = atoi(argv[1]); 
 +    int pid;     
 +    for(int i=0;i<nproc;++i) { 
 + SYSCALL(pid,fork(),"fork"); 
 + if(pid==0) { // figlio  
 +     sleep(SEC); 
 +     exit(0); // esco con successo 
 + } else  
 +     printf("%d: creato processo con pid = %d\n",  getpid(), pid);     
 +    } 
 +     
 +    // solo il processo padre arriva qui 
 + 
 +    // aspettiamo un po' in modo da essere "sicuri"  
 +    // che i processi figli siano terminati 
 +    sleep(2*SEC);  
 + 
 +    printf("Stato dei processi prima delle wait:\n"); 
 +    SYSCALL(pid,fork(),"fork"); 
 +    if(pid==0) { 
 + execlp("ps","ps",NULL); 
 + perror("eseguendo ps"); 
 + exit(errno); 
 +    } else { 
 + int stato; 
 + printf("Lanciato il processo con pid = %d per eseguire un ps\n",pid); 
 + SYSCALL(pid,waitpid(pid,&stato,0),"waitpid"); 
 + printf("Processo %d terminato\n",pid); 
 +    } 
 + 
 +    // adesso attendiamo la terminazione dei processi 
 +    for(int i=0;i<nproc;++i) { 
 + int stato; 
 + SYSCALL(pid,wait(&stato),"wait"); 
 + if(WIFEXITED(stato))  
 +     printf("Processo con pid %d terminato con una exit(%d)\n", 
 +    pid,WEXITSTATUS(stato)); 
 +    } 
 +    printf("Stato dei processi dopo la terminazione:\n"); 
 +    SYSCALL(pid,fork(),"creando il processo ps"); 
 +    if(pid==0) { 
 + execlp("ps","ps",NULL); 
 + perror("eseguendo il ps"); 
 + exit(0); 
 +    } else { 
 + int stato; 
 + SYSCALL(pid,waitpid(pid,&stato,0), 
 + "attendendo la terminazione del processo ps"); 
 +    } 
 +    return 0; 
 +
 +</code> 
 +  
 +==== pipe2proc.c (chiamate: fork, wait, getpid, write, pipe, dup, execve) ====
  
 Il programma crea un processo figlio che esegue il comando ''sort'' sull'input ricevuto in una ''pipe'' che connette lo standard output del padre con lo standard input del figlio ( padre -- ''pipe'' --> figlio).\\ Il programma crea un processo figlio che esegue il comando ''sort'' sull'input ricevuto in una ''pipe'' che connette lo standard output del padre con lo standard input del figlio ( padre -- ''pipe'' --> figlio).\\
informatica/sol/laboratorio15/esercitazionia/scexamples.1430041701.txt.gz · Ultima modifica: 26/04/2015 alle 09:48 (10 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki