Difference between revisions of "ProvaPratica 2012.07.17"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<syntaxhighlight lang = "C"> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 20 int main(int argc, char** argv){ int ncopie, ...")
 
Line 8: Line 8:
 
int main(int argc, char** argv){
 
int main(int argc, char** argv){
 
int ncopie, i, ris;
 
int ncopie, i, ris;
char NCOPIA[BUF_SIZE];
 
 
char command[BUF_SIZE];
 
char command[BUF_SIZE];
if (argc!=3) {printf("inserisci due argomenti (ncopie, command)\n"); exit(1);}
+
if (argc<3) {printf("inserisci due o più argomenti (ncopie, command)\n"); exit(1);}
 
ncopie = atoi(argv[1]);
 
ncopie = atoi(argv[1]);
 
strcpy(command, argv[2]);
 
strcpy(command, argv[2]);
Line 17: Line 16:
 
}
 
}
 
else {
 
else {
char *NCOPIA;
+
char *env_el;
NCOPIA = malloc(BUF_SIZE);
+
env_el = malloc(BUF_SIZE);
sprintf(NCOPIA, "%d", i);  
+
sprintf(env_el, "NCOPIA=%d", i);
char *newenviron[] = { NCOPIA};
+
//asprintf
ris = execve(command, NULL, newenviron);
+
//devo aggiungerci in fondo lo zero terminatore
 +
char *newenviron[] = {env_el, (char*) 0};
 +
//argv+2 sono gli argomenti, ovvero tutti gli argomenti passati dopo il secondo
 +
ris = execve(argv[2], argv+2, newenviron);
 
if (ris == -1) {perror("execve"); exit(1);}
 
if (ris == -1) {perror("execve"); exit(1);}
 
}
 
}
 
 
}
 
}
wait(NULL);
+
for (i = 0; i<ncopie; i++) wait(NULL);
 
return 1;
 
return 1;
}
+
}</syntaxhighlight>
</syntaxhighlight>
 
 
Alessandro
 
Alessandro
 
(In realtà non funziona bene, di fatto un processo fa quello che dovrebbe fare e gli altri danno bad address, se trovate l'errore correggetelo e scrivete qua sotto cosa avete cambiato e perché)
 
(In realtà non funziona bene, di fatto un processo fa quello che dovrebbe fare e gli altri danno bad address, se trovate l'errore correggetelo e scrivete qua sotto cosa avete cambiato e perché)

Revision as of 15:06, 19 May 2014

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 20

int main(int argc, char** argv){
	int ncopie, i, ris;
	char command[BUF_SIZE];
	if (argc<3) {printf("inserisci due o più argomenti (ncopie, command)\n"); exit(1);}
	ncopie = atoi(argv[1]);
	strcpy(command, argv[2]);
	for (i = 0; i<ncopie; i++){
		if(fork()){//processo padre
		}
		else {
			char *env_el;
			env_el = malloc(BUF_SIZE);
			sprintf(env_el, "NCOPIA=%d", i);
			//asprintf 
			//devo aggiungerci in fondo lo zero terminatore
			char *newenviron[] = {env_el, (char*) 0};
			//argv+2 sono gli argomenti, ovvero tutti gli argomenti passati dopo il secondo			
			ris = execve(argv[2], argv+2, newenviron);
			if (ris == -1) {perror("execve"); exit(1);}
		}
	}
	for (i = 0; i<ncopie; i++) wait(NULL);
	return 1;
}

Alessandro (In realtà non funziona bene, di fatto un processo fa quello che dovrebbe fare e gli altri danno bad address, se trovate l'errore correggetelo e scrivete qua sotto cosa avete cambiato e perché)