Posts written by GILA75

view post Posted: 21/2/2020, 19:58 Perplessità processi (c,java,python, generico) - Informatica.
Ecco, quando e se hai voglia...son ben accette critiche (anche pesanti :) ) e consigli

CODICE
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include <ncurses.h>
#include <fcntl.h>
#define ROW 24
#define COL 80
#define WRITE 1
#define READ 0

#define DX 261
#define SX 260
#define DOWN 258
#define UP 259
//*****************************************
// uso 2 array per le direzioni in modo da risparmiare 4 if
int dir_up_down[4]={0,0,-1,1}; // array per direzioni (variabili globali)
int dir_lat[4]={1,-1,0,0};



// prototipi
void prova_pipe_g(int pipe_out,int pipe2);
void prova_pipe_r(int pipe_in);
void tasti (int pipe2);
//****************************************************************************


//****************************************************************************
// routine per gestione tasti: impedisce movimenti in retro
// 261 sarebbe un offset 261-tasto es 258 (261-258)=3
// vuol dire che mando 3 con la pipe che in array int dir_up_down[4]={0,0,-1,1};
// corrisponde ad giu
void tasti (int pipe2)
{
       int ch=0;
       int buff[1];
       int tmp_dir=0;
       while (1)
       {
               ch=getch();

               if (ch==DX && tmp_dir!=1) //se vai a dx,negato sx
               {  
                       buff[0]=261-ch;tmp_dir=buff[0];
                       write(pipe2, buff, sizeof(int));
               }
                       
               if (ch==SX && tmp_dir!=0)
               {        
                       buff[0]=261-ch;tmp_dir=buff[0];
                       write(pipe2, buff, sizeof(int));//scrivo
               }
                       
               if (ch==UP && tmp_dir!=3)
               {  
                       buff[0]=261-ch;tmp_dir=buff[0];
                       write(pipe2, buff, sizeof(int));//scrivo
               }
                       
               if (ch==DOWN && tmp_dir!=2)
               {  
                       buff[0]=261-ch;tmp_dir=buff[0];
                       write(pipe2, buff, sizeof(int));//scrivo
               }
       }
}
               
       
//****************************************************************************
// processo che inizializza il bruco e gestisce i movimenti
// il bruco parte da dx a sx, se riceve una direzione valida
// la direzione cambia
// per muovere il bruco scalo le posizioni dell'array, poi aggiorno la testa
//****************************************************************************


void prova_pipe_g(int pipe_out,int pipe2) //guardia
{
       
       struct
       {
               int x[100];
               int y[100];
               int rnd;
               int tmp_coda_x;
               int tmp_coda_y;
               int corpo;
       }snake;
       snake.corpo=20;
       
       int j,buff[1],x,tmp_x,tmp_y;

       for (j=0; j<snake.corpo-1; j++)
       {
               snake.x[j]=10;  // creo array bruco
                snake.y[j]=31-j;
       }        

       
       for (j=0; j<snake.corpo-1; j++) // stampo bruco
       {
               move(snake.x[j], snake.y[j]);
               addch('@');
       }
       move(snake.x[0], snake.y[0]);
       addch('X');
       refresh();
       
       while(1)
       {
               x=fcntl(pipe2, F_SETFL, O_NDELAY); // attivo flag pipe non bloccante
               if (x!=-1) // se buffer non vuoto--->leggi
                       read(pipe2,buff,1*sizeof(int));
               
               snake.tmp_coda_x=snake.x[snake.corpo-1]; // memorizzo la coda che il padre metterà come spazio
               snake.tmp_coda_y=snake.y[snake.corpo-1];
                               
               for (j=0; j<snake.corpo-1; j++)
               {
                       tmp_x=snake.x[j+1];      // scalo posizioni per muovere
                       tmp_y=snake.y[j+1];      
                       snake.x[j+1]=snake.x[0];
                       snake.y[j+1]=snake.y[0];
                       snake.x[0]=tmp_x;
                       snake.y[0]=tmp_y;
               }

               snake.x[0]=snake.x[1]+dir_up_down[buff[0]]; //aggiorno dir testa in base al tasto arrivato
               snake.y[0]=snake.y[1]+dir_lat[buff[0]];
               write(pipe_out, &snake, sizeof(snake)); // scrivo  al padre
               usleep(90000);
       }
}
               
       

//****************************************************************************
// il padre legge e stampa i dati
//****************************************************************************

void prova_pipe_r(int pipe_in) // pipe padre(legge)
{

       struct
       {
               int x[100];
               int y[100];
               int rnd;
               int tmp_coda_x;
               int tmp_coda_y;
               int corpo;
       }st_padre;
       
       int i;

       
       while(1)
       {
               read(pipe_in,&st_padre,sizeof(st_padre));        // Leggo l'evento
               move (st_padre.tmp_coda_x, st_padre.tmp_coda_y);
               addch(' ');
                       
               for (i=0; i<st_padre.corpo-1; i++)
               {
                       move (st_padre.x[i], st_padre.y[i]);
                       addch('@');
               }
                       
               move (st_padre.x[0], st_padre.y[0]);
               addch('X');refresh();        
                       
       }
}
       

int main(void)
{
       
       int pid[2];
       int my_pipe[2];
       int my_pipe_2[2];
       initscr();   // init ncurses
       cbreak();
       noecho();
       curs_set(0);
       intrflush(stdscr, FALSE);
       keypad(stdscr, TRUE);
       
       
       if (pipe(my_pipe)==-1)
       {
               puts("erroer");
               return -1;
       }

       if (pipe(my_pipe_2)==-1)
       {
               puts("erroer");
               return -1;
       }
       
//********************************************
//                        figlio 1
//********************************************
       
       pid[0] = fork();
       if ( pid[0] == -1 )
       {
               printf ("Impossibile creare un nuovo processo\n");
               exit(1);
       }

       if ( pid[0] == 0 )
       {
               close (my_pipe[READ]);
               prova_pipe_g(my_pipe[WRITE],my_pipe_2[READ]); //passo descrittore pipe scrittura
       }    
       
//********************************************
//                        figlio 2
//********************************************
       
       pid[1] = fork();
       if ( pid[1] == -1 )
       {
               printf ("Impossibile creare un nuovo processo\n");
               exit(1);
       }

       if ( pid[1] == 0 )
       {
               tasti(my_pipe_2[WRITE]); //passo descrittore pipe scrittura
       }    


       else // entro nel padre (main)
       {
               prova_pipe_r(my_pipe[READ]);
       }

       endwin();
       return 0;

}
view post Posted: 21/2/2020, 18:55 Perplessità processi (c,java,python, generico) - Informatica.
Ora non riesco, poi guardo.
Se ti posto il mio listato fin'ora, hai voglia di guardare?..e' commentato, magari mi dai dritte sulla logica.
Dimmi tu
view post Posted: 21/2/2020, 17:39 Perplessità processi (c,java,python, generico) - Informatica.
Si, ci sono cose migliorabili sicuramente, ma voglio provare a finire, poi al massimo ritocco.
Sarebbe bello capire come va impostato quale processo deve fare cosa ecc...
view post Posted: 21/2/2020, 16:45 Perplessità processi (c,java,python, generico) - Informatica.
Ah, non lo sapevo...proverò a spulciare il web
Bhe, comunque con una pipe non bloccante sembra andare bene.
Adesso ci sono d'aggiungere altre cose...eh...con calma.
Spero di chiudermi la strada. Ho il sospetto che andrebbe strutturato diversamente, ma più faccio più capisco
dove correggere. A teoria funziona sempre tutto
view post Posted: 21/2/2020, 16:35 Perplessità processi (c,java,python, generico) - Informatica.
Ecco a chi interessasse i primi movimenti gestiti da tasti...sembra abbastanza fluido no?
view post Posted: 21/2/2020, 15:24 Perplessità processi (c,java,python, generico) - Informatica.
Ho letto e riletto Law...ma devo rifarlo ancora e ancora. Credo di aver capito più o meno.
Però alla luce di tutto allora cosa mi consigli di fare ?
Mi spiego: io ho un sistema operativo, un linguaggio di programmazione e sto "giocherellando" con i processi.
Quindi cosa dovrei fare ? Questo non ho capito. Abbandonare l'idea ?
Studiarmi più a fondo cosa gira sotto il cofano ?

Comunque divagando un po'. Il gioco del bruco con ncurses, processi e tutto è molto più impestato di quello che credevo.
problemi su problemi.

un processo(1) fa andare il bruco , invia i dati al padre che si occupa di visualizzare e fin qui ci siamo.
L'altro processo (2) si deve occupare dei tasti, per far cambiare la posizione.
Ma qui viene il bello:
con i micro per esempio puoi fare scansioni veloccisime: premuto tasto ? si fai, no, passa oltre.
Qui invece getch() aspetta quindi l'altro processo che aspetta di ricevere i dati con read è bloccato.
Sono dovuto ricorrere ad una pipe non bloccante.
Insomma tutto facile a dirsi, meno a farsi.
view post Posted: 20/2/2020, 18:29 Perplessità processi (c,java,python, generico) - Informatica.
CITAZIONE
Poi ti mandiamo al MIT e a Oxford così ti danno lauree a iosa...

Ci conto !!! :D :D
view post Posted: 20/2/2020, 18:23 Perplessità processi (c,java,python, generico) - Informatica.
Al volo Law, ho letto solo l'inizio, ora sono impicciato ma ci tengo su questo:
Non sono offeso in alcun modo, e spero che io non abbia offeso te.
Frequento questo forum da anni e la tua compagnia e i tuoi consigli sono sempre graditi.
Intendevo che forse è meglio se mi faccio da parte visto che non riesco a seguire certi concetti e rischio di fare un minestrone.
Intesi Law ? Mi dispiace se mi sono posto male...davvero. Solo che sono molto confuso per i punti che ti ho esposto prima.
Con calma dopo leggo tutto il messaggio.
view post Posted: 20/2/2020, 15:07 Perplessità processi (c,java,python, generico) - Informatica.
Perdonami Law... ma non capisco.
Credo che questo sarà il mio ultimo messaggio di questo 3d, non perchè sono offeso (di cosa poi ?)
ma perchè il mio intento è di cercare e condividere cose che possano essere interessanti.
Se viceversa la mia ignoranza porta solo a confusione e non da nulla a me,voi, al forum, meglio abbandonare.
Detto questo:
io sto parlando del C perchè in questo momento mi sto dedicando al C. Nessun tifo, nulla di nulla.
Non sto dicendo che il C vada bene per tutto, ci saranno applicazioni dove è necessario e dove è da pazzi.
Fermo restando al C, io stavo facendo esperimenti con processi ecc...roba che è scritta su tutti i manuali, non è
mia invenzione...quindi su quello mi baso.
Io di assembler non ne so nulla, se non rudimenti di anni fa dell'asm dei pic, che al 99% non c'entrerà una mazza
con l'asm dei processori.
Quindi non capisco....
Tutto era partito da processi VS macchine a stati finiti.
Cioè mi sarebbe piaciuto capire le differenze, fino a che punto "il multitask dei poveri" può arrivare, e dove invece
devi adottare processi "concorrenti". Tutto li.
Poi non so, abbiamo tanto parlato anche in passato che nessuno ha più voglia di sperimentare e imparare, ma
il messaggio che mi arriva è: o sei un super programmatore nato nei tempi d'oro e con i contro attributi...o
scriverai solo idiozie. A sto punto meglio la pupa e il secchione, non concordi ?
Logico che uno che non lavora nell'ambiente non farà cose perfette.
Pure il "famoso" mio theremin farà schifo, ma ho imparato cosa sono i battimenti, fare degli oscillatori un mixer ecc...

In conclusione, visto che non capisco (se hai voglia) ti faccio io domande:
1) si sta parlando del C ? ( mie risposte : si)
2) in C esistono processi, thread,pipe, socket ecc... ? (si)
3) si sta parlando di programmazione "lato" pc ? (si)

Quindi ribadisco: non capisco.
Poi ultima cosa, sempre e solo mie considerazioni da un sig nessuno come sono io.
Sembrerebbe, da come mi pare di leggere, che dagli anni d'oro c'è stata un'involuzione dei linguaggi ecc...
Sicuramente i programmi ad alto livello avranno attirato miglia di cialtroni, ma mi pare che non si sia andati indietro no ?
Penso alla grafica dei videogiochi, alle astrazioni di certi linguaggi ecc.
Comunque, mi rendo conto a malincuore, che non posso seguirvi, quindi lasciamo stare tutto, non voglio
davvero "imballare" il forum con cose che non posso capire.
Grazie comunque della risposta, che rileggo più e più volte, magari capisco meglio ciò che vuoi dire ;)

EDIT:
CITAZIONE
Quindi, ritornando all'informatica, tutti i processori sono microcodificati con il loro codice macchina, hanno un assembler, e dei compilatori o interpreti che poi arrivano ai linguaggi superiori. Non c'è un Java o un Pyton che vivono di energia propria. State quindi attenti a non fare l'errore che tutti fanno oggi e facevano negli anni 80,quando sostenevano che il mondo andava verso il BASIC

Siamo tutti d'accordo. Nemmeno l'assembler a sto punto vive di energia propria...bisogna conoscere l'hardware ...
ma l'hardware ? il silicio, il drogaggio (se non ricordo male)...ok, cosa governa il silicio a livello atomico ? e via dicendo
Ci si pone dei limiti. So che il C è scritto in asm e do (spero) per scontato che sia scritto bene, ma io non m'interesso.
non credo si possa andare indietro all'infinito...poi bho, ho concluso
view post Posted: 20/2/2020, 12:56 Perplessità processi (c,java,python, generico) - Informatica.
Non ho le competenze per risponderti Law, tanto più che non riesco a capire se qui

CITAZIONE
Qualche demente s'è divertito inventando il "C" tipo Kernigan & Rithch e poi gli altri dementi gli sono andati dietro. Il basic fa schifo è da nerd... ecco un altro cretino ubriaco

sei ironico o no.
Una domanda sola: da come dici (sembrerebbe a me, magari mi sbaglio), tutto quello che viene dopo a
prestantissimi programmi asm, test di bit, flag ecc...è spazzatura ?
Non so Guido Van Rossum inventore di python, è un matematico, non credo sia un cretino.
Python viene usato in un sacco di cose, e dove non ci arriva sub'entra il C, e dove il C latita, magari si torna
all'asm.
Ripeto mollo il colpo...
La parola ad altri se ne hanno voglia, se no, lasciamo la discussione così com'è.
Io i processi per puro diletto continuerò a studiarli, non mi fanno campare...ma sempre meglio che guardare
la pupa e il secchione
view post Posted: 19/2/2020, 21:42 Perplessità processi (c,java,python, generico) - Informatica.
Chiarissimo Robo.
Come sospettavo stiamo parlando di ambiti molto diversi.
view post Posted: 19/2/2020, 17:19 Perplessità processi (c,java,python, generico) - Informatica.
Non so, ripeto sono confuso. Ho sempre letto che per operazioni contemporanee si usano processi, thread ecc.
Non ho mai pensato alla contemporaneita' fatta du un microprocessore, dove tutto e' diverso, hai interrupt, timer, moduli hardware...quello che dice Law e' sacrosanto, ma credo si parli di programmazione molto efficente ma di parecchi anni fa...ripeto, fatemi ragionare che poi posto esempi.
view post Posted: 19/2/2020, 11:45 Perplessità processi (c,java,python, generico) - Informatica.
CITAZIONE
Come dicevo qualche post più in su, è la strategia da adottare e non il sistema operativo o il processore multi-qualcosa.
Cioè si deve lavorare con lo stato delle flag (bit) che ti servono, registrate in memoria e jumpi o calli solo se quel bit è a 1 oppure vai avanti. Non è facile da descrivere e se ti posto un programma scritto per Z80 con BIT, SET e RESET manco me lo cagate perchè è "antico". Ci sono dei processori ASICS fatti a proposito dai maggiori produttori di PAC (Programmable Advanced Controller) o PLC (Programmable Logic Controllers) per fare operazioni con i BIT, già, con un singolo BIT senza fermarsi ed aspettare, ma è la stessa cosa delle istruzioni Z80 BIT, SET,RES. Solo eseguite molto più rapidamente ed il risultato viene "storato" in un BIT del processore chiamato RLO (Result of Logic Operation). Il resto del processo te lo devi organizzare da te, timer, counter e memoria a BIT dedicata al RLO.
Insomma, i linguaggi C, X, Y, Z, ecc... non sono per accendere e spengere led lampadine, elettrovalvole, relay, ma per gestire grafici, video, stringhe di caratteri accessi ai dischi o alla rete ed altre inutili amenità che oggi vanno "troppo" di moda.
Vi piaccia o no, ci crediate o no, vi sembri troppo semplice o no, è così. ;)

Alzo le mani, perchè a sto punto mi sto confondendo troppo. Capisco che con microprocessori si testino bit,flag ecc...
ma non capisco invece se lato pc sia giusto adottare processi ecc...
A quanto pare, sono ancora troppo ignorante in merito, e non mi va di insistere (visto che non capisco)
Lascio decantare un po' la cosa... :(
1581 replies since 4/11/2007