|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
prima esperiena (solo didattica) di programmazione con i processi
ciao a tutti, oggi ho provato a fare un semplicissimo programmino che creasse 5 processi e successivamente per mezzo dell'ultimo processo permette di killare tutti gli altri
questo è quanto ho prodotto... Codice:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#define MAX_PROC 5
int main() {
/* definizione delle variabili locali al main */
pid_t pid;
pid_t vettproc[MAX_PROC];
unsigned int numproc = 0;
unsigned int counter;
/* creazione dei processi figlio */
printf("Creating...\n");
while(numproc < MAX_PROC) {
pid = fork();
if(pid != 0) {
while(1);
} else {
vettproc[numproc] = getppid();
}
printf("PROCESSO: %d\tPID: %d\tPID_PADRE: %d\n",numproc,getpid(),getppid());
getchar();
numproc++;
}
/* controllo processi in esecuzione */
system("ps");
/* ciclo di cancellazione */
printf("\nKilling...\n");
do {
numproc--;
printf("PROCESSO: %d\tPID: %d\n",numproc,vettproc[numproc]);
kill(vettproc[numproc],SIGKILL);
getchar();
} while(numproc >= 0);
return(0);
}
una manina??? ps ovviamente il programma è scritto per linux |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Stranamente, eseguendo il tuo programma cosi' com' e', sul mio sistema si ferma alla creazione del primo figlio... e non va piu' avanti!
Boh, non ho guardato bene il codice; magari piu' tardi ti fo' sapere... Ciao
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
secondo me è sbagliato un po' di tutto. il mio consiglio è di far rimanere attivo il padre (di tutti) e ogni figlio appena creato esegue una wait() e poi il padre li uccide tutti. nel modo in cui lo fai tu ogni figlio crea un altro figlio e quandi uccidi un parente si vengono a creare dei processi zombie.
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#define MAX_PROC 5
int main() {
/* definizione delle variabili locali al main */
pid_t pid;
pid_t vettproc[MAX_PROC];
unsigned int numproc = 0;
unsigned int counter;
/* creazione dei processi figlio */
printf("Creating...\n");
while(numproc < MAX_PROC) {
pid = fork();
if(pid != 0) {
vettproc[numproc]= pid;
} else {
printf("PROCESSO: %d\tPID: %d\tPID_PADRE: %d\n", numproc, getpid(), getppid());
wait();
}
getchar();
numproc++;
}
/* controllo processi in esecuzione */
system("ps");
/* ciclo di cancellazione */
printf("\nKilling...\n");
do {
numproc--;
printf("PROCESSO: %d\tPID: %d\n", numproc, vettproc[numproc]);
kill(vettproc[numproc],SIGKILL);
getchar();
} while(numproc >= 0);
return(0);
}
Ultima modifica di VegetaSSJ5 : 21-05-2005 alle 17:24. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
per fare in modo che il discendente più giovane (passatemi il termine) possa uccidere il vecchio antenato forse bisogna fare in modo che il processo principale diventi il più giovane no??? |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
fammi capire... l'ultimo figlio deve uccidere solo il padre oppure deve uccidere anche tutti gli altri figli? oppure non ha importanza chi uccida gli altri figli ma è importante che gli altri figli vengano uccisi dall'ultimo?
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
non avevo visto la getchar()...Comunque, a guardarlo il programma non sembra scorretto, non credo ci siano problemi se un processo uccide quello che lo ha generato
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
Il primo processo esegue la fork() e poi esamina il valore ritornato; se e' positivo, allora si sta eseguendo ancora il processo iniziale, percio' si entra nel while(1); se e' zero, allora ci si trova nel figlio appena creato. Questo figlio effettua alcune operazioni, poi rientra nel ciclo while di creazione e rifa' la stessa cosa, cioe': crea un nuovo figlio, e poi entra nel while(1), mentre il figlio appena creato ripete il ciclo di creazione... processo_0: crea processo_1 e poi cicla all'infinito; processo_1: crea processo_2 e poi cicla all'infinito; processo_2: crea processo_3 e poi cicla all'infinito; ................. ................. ecc. ecc. L' ultimo figlio creato non rientra nel ciclo di creazione perche' numproc=MAXPROC, percio' non crea nessun altro figlio; pero' invia SIGKILL a tutti gli "antenati", che in quel momento sono tutti in loop nel while(1). Boh! Io ne ho fatto una versione semplificata: un processo crea un figlio soltanto, quindi entra in un loop infinito; il figlio "uccide" il padre; sembra andare bene, ma non capisco l'output. Vi riporto il listato: Codice:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include "./connessioni/semafori.h"
int main(void)
{
int mutex;
key_t chiave=500;
setvbuf(stdout,NULL,_IONBF,0);
pid_t pid;
mutex=SemCreate(chiave,1,0660,NULL);
SemSet(mutex,0,0,1,NULL);
SemWait(mutex,0,NULL);
pid=fork();
if (pid>0)
{
printf("Padre: %d, loop infinito...\n",getpid());
SemSignal(mutex,0,NULL);
while (1)
;
return 0;
}
else
{
if (pid==0)
{
setvbuf(stdout,NULL,_IONBF,0);
SemWait(mutex,0,NULL);
printf("Figlio: %d, tenta di terminare %d\n",getpid(),getppid());
if (kill(getppid(),SIGKILL)<0)
perror("Kill error");
else printf("Kill success\n");
printf("Premi enter...");
getchar();
SemSignal(mutex,0,NULL);
return 0;
}
else
perror("Fork error");
}
return 0;
}
Quote:
C'e' qualcosa che ci sfugge Ah, ignorate le funzioni Sem***, sono mie funzioni per usare semafori, cosi' che si esegua sicuramente prima la parte if (pid>0). Le setvbuf servono per non bufferizzare l'output.
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
il padre di tuttodeve rimanere in esecuzione quindi a programma modificato niente crash Ultima modifica di sirus : 25-05-2005 alle 11:50. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
Grazie, Gica
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
ma quando l'ultimo figlio "ammazza" il padre (primo processo) il sistema in qualche modo crasha non so il motivo |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Aug 2004
Città: Mariano Comense (Como)
Messaggi: 5657
|
Quote:
__________________
Acer Aspire 5740G & Microsoft Windows 7 Home Premium 64bit (Client) | Acer Aspire 5310 & Microsoft Windows XP Pro SP3 32bit (Server)
n.2 WD MyBook mirror edition 2TB (RAID 0) | Netgear EVA9150 | Sony 52w4500 | Logitech Z-5500 Digital | Logitech G25 | Homemade F1 Cockpit |
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Direi che il problema e' qui:
Codice:
do {
numproc--;
printf("PROCESSO: %d\tPID: %d\n",numproc,vettproc[numproc]);
kill(vettproc[numproc],SIGKILL);
getchar();
} while(numproc >= 0);
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:02.











non avevo visto la getchar()...







