- Messaggi: 51
- Ringraziamenti ricevuti 0
LINUX AVANZATO 2007
- COM_EASYSOCIAL_GUEST_NAME
-
- 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
-
- 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....
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- 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:
Senza l'edit questo forum diventa seccante a volte...
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
-
- 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.
- caterina bianchi
-
- Offline
- Senior Member
-
Riduci
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
Spero di essermi spiegato...
Ciao ciao
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- 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.