|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
[C e Linux] Parte Seconda - Generazione di processi multipli
Salve ancora una volta. Grazie al vostro aiuto sono infine riuscito a completare il codice dell'altro esercizio. Ora pero' sto provando con qualcosa di piu' complesso: la programmazione concorrente. Il seguente codice non fa altro che generare N processi, ciascuno dei quali non fa altro che stampare a video la scritta "Sono il processo x". Nell'esempio il codice genera 5 processi.
Codice:
main(int argc, char *argv[])
{
void generator(int N);
generator(5);
}
void generator(int N)
{
pid_t pid;
int j = N;
pid = fork();
if((pid == 0) && (j != 0))
{
printf("Sono il processo %i\n", j);
}
else if((pid>0) && (j != 0))
{
j = j - 1;
generator(j);
}
else if(j = 0)
printf("FINE");
else
printf("Si e' verificato un errore nella chiamata a fork.\n");
}
knoppix@2[knoppix]$ a.out Processo 5 Processo 4 Processo 3 Processo 2 Processo 1 Si e' verificato un errore nella chiamata a fork. Si e' verificato un errore nella chiamata a fork. Dove ho sbagliato, stavolta? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
--- fk.c.org 2005-08-26 11:07:20.000000000 +0200
+++ fk.c 2005-08-26 11:08:19.000000000 +0200
@@ -21,7 +21,7 @@
j = j - 1;
generator(j);
}
- else if(j = 0)
+ else if(j == 0)
printf("FINE");
else
printf("Si e' verificato un errore nella chiamata a fork.\n");
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
Devo cercare di essere piu' veloce...
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Grazie, siete mitici!!!
Ora un altro piccolo dubbio... Dovreifar eseguire dal codice un altro programma compilato, facendogli passare 2 argomenti. Ovviamente devo usare execl o una sua variante ma nonostante abbia fatto diversi tentativi, non riesco ad ottenere il risultato desiderato. Essenzialmente, il processo figlio deve stampare a video i due parametri passati... Codice:
#include <stdio.h>
main(int argc, char *argv[])
{
printf("# %s: %s\n", argv[1], argv[2]);
}
knoppix@1[knoppix]$ prova1.out 2 ciao # 2: ciao Il processo padre, invece, deve chiamare il figlio passandogli i 2 parametri da stampare... Codice:
...
execl("prova1.out", "2", "ciao", (char *)0);
...
knoppix@1[knoppix]$ prova.out # ciao: (null) Qualcuno mi illustra come si usa execl che sono disperato? |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
OT:
spesso vedo questa notazione: Codice:
--- fk.c.org 2005-08-26 11:07:20.000000000 +0200
+++ fk.c 2005-08-26 11:08:19.000000000 +0200
@@ -21,7 +21,7 @@
j = j - 1;
generator(j);
}
- else if(j = 0)
+ else if(j == 0)
printf("FINE");
else
printf("Si e' verificato un errore nella chiamata a fork.\n");
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jun 2004
Città: Pecetto
Messaggi: 73
|
Normalmente argv[0] corrisponde al nome dell'eseguibile.
Prova execl("prova1.out","prova1.out", "2", "ciao", (char *)0);
__________________
Gianni |
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
Dalla man-page di int execl(const char *path, const char *arg, ... /*, (char *)0 */); Quote:
Ciao
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
||
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2003
Città: Trieste, Pordenone
Messaggi: 920
|
Quote:
diff(1) ...o qualcosa di analogo, suppongo!
__________________
buy here |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:49.



















