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
informatica:sol:laboratorio15:esercitazionia:scexamples [26/04/2015 alle 09:49 (10 anni fa)] – [pipe2proc.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>
  
 +==== 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) ==== ==== pipe2proc.c (chiamate: fork, wait, getpid, write, pipe, dup, execve) ====
  
informatica/sol/laboratorio15/esercitazionia/scexamples.1430041771.txt.gz · Ultima modifica: 26/04/2015 alle 09:49 (10 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki