fbpx
Skip to main content

LINUX AVANZATO 2007

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 6 Mesi fa #46595 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Questa la mia versione della prova al calcolatore di oggi.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#include <sched.h>

int clone_func() {
	
	int tempo_esecuzione = rand() % 20 + 1;
	printf("sono clone %d e dormirò per %d secondi\n", getpid(), tempo_esecuzione);
	sleep(tempo_esecuzione);
	return 0;
}
	
int main(int argn, char **argv) {
	
	int N = atoi(argv[1]);
	int K = atoi(argv[2]);
	
	int pid[N];
	int pid_padre;
	int terminato[K];
	
	int stackclone[N][1024];
	
	int i, j, t;
	
	//creo N cloni
	for(i = 0; i < N; i++) {
		pid[i] = clone(clone_func, &stackclone[i][1023], CLONE_VM, NULL);
		printf("creato clone %d\n", pid[i]);
	}
	
	//attendo terminazione K cloni
	for(j = 0; j < K; j++) {
		terminato[j] = waitpid(-1, NULL, __WCLONE);
		printf("clone %d terminato\n", terminato[j]);
	}
	
	//scorro i cloni per controllare quali non sono ancora terminati, setto eventualmente a 0 il valore nell'array dei pid se uno di essi è già terminato
	for(i = 0; i < N; i++) {
		for(t = 0; t < K; t++) {
			if(pid[i] == terminato[t]) 
				pid[i] = 0;
		}
	}

	//uccido cloni non ancora terminati
	for(j = 0; j < N; j++) {
		if(pid[j]) {
			kill(pid[j], SIGKILL);
			printf("clone %d ucciso\n", pid[j]);
		}
	}
	
	return 0;
	
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 6 Mesi fa #46596 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
Di ieri scusate.... :lol: :lol:

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 6 Mesi fa #46598 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
L'istruzione che calcola il tempo di esecuzione del figlio (compreso tra 1 e 10 secondi) è ovviamente questa:
int tempo_esecuzione = rand() % 10 + 1; 

Senza l'edit questo forum diventa seccante a volte...

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 6 Mesi fa #46602 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
ho provato a fare il programma della trasposta, il problema è che con la lseek gli dico di mettere un elemento in un certo punto del file e non lo fa lo accoda e basta, se qualcuno trova l'errore:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>

#include<sys/types.h>
#include<sys/stat.h>

int main (int argc, char* argv[]){
	
	
	//printf("%s, %s\n", argv[1], argv[2]);
	int R = atoi(argv[1]);
	int C = atoi(argv[2]);
	
	printf("Creo una matrice %d x %d\n", R, C);
	
	int i, j;
	unsigned int num;
	
	int fd = open("matrice.txt", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU);
	int fd2 = open("matrice_trasposta.txt", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU);
	
	for(i=0; i<R; i++){
		for(j=0; j<C; j++){
			printf ("Inserisci il termine %d della riga %d\n", j+1, i+1);
			scanf("%u", &num);
			write(fd, &num, sizeof(num));
		}
	}
	
	printf("La matrice che hai inserito è:\n");
	lseek(fd, SEEK_SET, 0);
	for(i=0; i<R; i++){
		for(j=0; j<C; j++){
			read(fd, &num, sizeof(num));
			printf("%u ", num);
		}
	}
	printf("\n");
	lseek(fd, SEEK_SET, 0);
	
	//inizializza file 2
	num=0;
	for(i=0;i<(R*C);i++){write(fd2,&num,sizeof(num));}
	lseek(fd2, SEEK_SET, 0); 
	printf("Il file2 è inizializzato così:\n");
	
	for(i=0; i<C; i++){
		for(j=0; j<R; j++){
			read(fd2, &num, sizeof(num));
			printf ("%u ", num);
		}
		printf("\n");
	}
	lseek(fd2, SEEK_SET, 0); 
	// fine
	
	
	for(i=0; i<R; i++){
		for(j=0; j<C; j++){
			read(fd, &num, sizeof(num));
			printf("Ho letto %u lo metto nella posizione %d\n", num, j*R+i);
			lseek(fd2, SEEK_SET, (j*R+i)*sizeof(num));
			write(fd2, &num, sizeof(num));
		}
	}
	
	printf("La trasposta è:\n");
	lseek(fd2, SEEK_SET, 0);
	for(i=0; i<C; i++){
		for(j=0; j<R; j++){
			read(fd2, &num, sizeof(num));
			printf ("%u ", num);
		}
		printf("\n");
	}
	
	printf("In linea è:\n");
	lseek(fd2, SEEK_SET, 0);
	for(i=0; i<R; i++){
		for(j=0; j<C; j++){
			read(fd2, &num, sizeof(num));
			printf("%u ", num);
		}
	}
	printf("\n");
	
	close(fd);
	close(fd2);
	return 0;

}

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
18 Anni 6 Mesi fa #46604 da caterina bianchi
Risposta da caterina bianchi al topic LINUX AVANZATO 2007
Secondo me la lseek ti converrebbe farla sul primo file quello che tu hai chiamato "matrice.txt", in modo che leggi la matrice che hai scritto per colonne e quindi in scrittura (su matricetrasposta.txt) puoi andare a scrivere un numero dopo l'altro...

Spero di essermi spiegato...
Ciao ciao

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
18 Anni 6 Mesi fa #46627 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic LINUX AVANZATO 2007
trovato, la lseek è scritta con gli armoneti al contrario ;-)

Si prega Accedi o Crea un account a partecipare alla conversazione.