Difference between revisions of "ProvaPratica 2012.07.17"
Jump to navigation
Jump to search
| Line 32: | Line 32: | ||
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é) | ||
| + | |||
| + | <syntaxhighlight lang="C"> | ||
| + | #include <stdio.h> | ||
| + | #include <unistd.h> | ||
| + | #include <stdlib.h> | ||
| + | #include <string.h> | ||
| + | #include <fcntl.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 argomenti (ncopie, command)\n"); exit(1);} | ||
| + | ncopie = atoi(argv[1]); | ||
| + | int fd[ncopie]; | ||
| + | pid_t pid[ncopie]; | ||
| + | for (i = 0; i<ncopie; i++){ | ||
| + | char *tmpfile; | ||
| + | asprintf(&tmpfile,"/tmp/ncopie.%d.%d",getpid(),i); | ||
| + | fd[i]=open(tmpfile,O_CREAT|O_RDWR,0600); | ||
| + | unlink(tmpfile); | ||
| + | if((pid[i]=fork())==0){//processo padre | ||
| + | char *NCOPIA; | ||
| + | asprintf(&NCOPIA, "NCOPIA=%d", i); | ||
| + | char *newenviron[] = { NCOPIA, (void *)0}; | ||
| + | dup2(fd[i],STDOUT_FILENO); | ||
| + | ris = execve(argv[2], argv+2, newenviron); | ||
| + | if (ris == -1) {perror("execve"); exit(1);} | ||
| + | } | ||
| + | } | ||
| + | for (i = 0; i<ncopie; i++) { | ||
| + | waitpid(pid[i],NULL,0); | ||
| + | lseek(fd[i],SEEK_SET,0); | ||
| + | char *buf[1024]; | ||
| + | int n; | ||
| + | while ((n=read(fd[i],buf,1024))>0) | ||
| + | write(STDOUT_FILENO,buf,n); | ||
| + | } | ||
| + | |||
| + | return 1; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
Revision as of 15:09, 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é)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.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 argomenti (ncopie, command)\n"); exit(1);}
ncopie = atoi(argv[1]);
int fd[ncopie];
pid_t pid[ncopie];
for (i = 0; i<ncopie; i++){
char *tmpfile;
asprintf(&tmpfile,"/tmp/ncopie.%d.%d",getpid(),i);
fd[i]=open(tmpfile,O_CREAT|O_RDWR,0600);
unlink(tmpfile);
if((pid[i]=fork())==0){//processo padre
char *NCOPIA;
asprintf(&NCOPIA, "NCOPIA=%d", i);
char *newenviron[] = { NCOPIA, (void *)0};
dup2(fd[i],STDOUT_FILENO);
ris = execve(argv[2], argv+2, newenviron);
if (ris == -1) {perror("execve"); exit(1);}
}
}
for (i = 0; i<ncopie; i++) {
waitpid(pid[i],NULL,0);
lseek(fd[i],SEEK_SET,0);
char *buf[1024];
int n;
while ((n=read(fd[i],buf,1024))>0)
write(STDOUT_FILENO,buf,n);
}
return 1;
}