Perplessità processi (c,java,python, generico)

« Older   Newer »
  Share  
view post Posted on 18/1/2020, 12:42
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Dunque, ok per il monodirezionale ma continuo a pensare che quelle close() siano errate... magari prova!

Vedo che sono citati i socket anche qua, e quindi torno a pensare che decisamente siano una soluzione migliore! Tra l'altro l'indirizzo 127.0.0.1 dovrebbe essere disponibile sempre anche se non c'è la scheda di rete, per quanto poi oggigiorno tutti hanno una scheda di rete.

Stavo però pensando anche... non dovresti "aspettare", specie in lettura, che i dati siano presenti? Il tuo codice "passa" attraverso le write (diciamo che questo è ok) e le read (e qua non so...) senza aspettare che i dati siano passati... qualcosa tipo un "check data ready"?


Be' il senso ce l'ha sempre :) per imparare!

dopo posto un programma trovato in rete, sembra usino close nello stesso modo.
Si, i socket penso siano meglio. Da quanto ho capito, le pipes, sono uno dei primi metodi e forse anche i più
rudimentali. Avevo fatto prove anche con i socket. Mi sono imbattuto nelle pipes, per puro diletto ed esercizio.

CITAZIONE
Stavo però pensando anche... non dovresti "aspettare", specie in lettura, che i dati siano presenti? Il tuo codice "passa" attraverso le write (diciamo che questo è ok) e le read (e qua non so...) senza aspettare che i dati siano passati... qualcosa tipo un "check data ready"?

allora, quando io scrivo il buffer write (se non erro di pochi kb), manda i dati alla read. Read appena riempie il buffer, blocca write che aspetta lo svuotamento...se dico giusto...
questo finchè la chiamata è atomica (inferiore al buffer). nel caso contrario le cose potrebbero essere diverse.
Come detto, i dettagli sono molti, e occorrono parecchie prove e studio.
Cosa che al 99% in Python& company, non ti devi preoccupare...ma è bello anche imparare.
Per esempio in set di python, vengono implementate le tabelle di hash, cosa che se non hai scritto in C
non sai nemmeno cosa sono, come sono gestite le collisioni: indirizzamento aperto ? Liste di trabocco ???
Insomma il C non è propriamente semplice
 
Top
view post Posted on 18/1/2020, 13:01
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Sì, le cose che in altri linguaggi sono incorporate, in C te le devi costruire... è bello perché impari e crei mattoni che altri useranno, ed è il motivo per cui io studiai elettronica e non informatica - mi piaceva essere "alla base di quello che altri avrebbero usato" :)

Allora ok, se le chiamate sono bloccanti (specie se i buffer sono piccoli) tutto ok.
 
Top
view post Posted on 21/1/2020, 17:51
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ecco, questo è un esempio ufficiale e non scritto da un dilettante come me. Sembra che anche qui si aprano e chiudano i "canali"
CODICE
#include <sys/types.h>
      #include <sys/wait.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <unistd.h>
      #include <string.h>

      int
      main(int argc, char *argv[])
      {
          int pipefd[2];
          pid_t cpid;
          char buf;

          if (argc != 2) {
              fprintf(stderr, "Usage: %s <string>\n", argv[0]);
              exit(EXIT_FAILURE);
          }

          if (pipe(pipefd) == -1) {
              perror("pipe");
              exit(EXIT_FAILURE);
          }

          cpid = fork();
          if (cpid == -1) {
              perror("fork");
              exit(EXIT_FAILURE);
          }

          if (cpid == 0) {    /* Child reads from pipe */
              close(pipefd[1]);          /* Close unused write end */

              while (read(pipefd[0], &buf, 1) > 0)
                  write(STDOUT_FILENO, &buf, 1);

              write(STDOUT_FILENO, "\n", 1);
              close(pipefd[0]);
              _exit(EXIT_SUCCESS);

          } else {            /* Parent writes argv[1] to pipe */
              close(pipefd[0]);          /* Close unused read end */
              write(pipefd[1], argv[1], strlen(argv[1]));
              close(pipefd[1]);          /* Reader will see EOF */
              wait(NULL);                /* Wait for child */
              exit(EXIT_SUCCESS);
          }
      }
 
Top
view post Posted on 21/1/2020, 18:01
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


che strano...
 
Top
view post Posted on 22/1/2020, 19:58
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


e si, sembra un po' macchinoso, ma come detto è un argomento davvero vasto.
I miei dubbi (dettati dall'ignoranza in merito) sono tanti.
Un'altro per esempio è se le pipes siano monouso o meno: se io ho un processo che comunica all'altro in più riprese
è fattibile con la stessa pipe ? Oppure cessa una volta scritti i dati ?
Da prove sommarie sembrerebbe non si possano riutilizzare...bho non sono sicuro... :wb:
Magari per implementare un rudimentale gioco del bruco, i processi non sono così fondamentali.
Si potrebbe fare tutto a polling (si dice così ? non ricordo più), ma durante le temporizzazioni, per esempio
il programma sarebbe sordo alla pressione dei tasti di movimento...insomma non sarebbe il massimo credo.
 
Top
view post Posted on 22/1/2020, 20:02
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Bah no la cosa strana rimane quella della "close", io la trovo del tutto insensata. Ma, per me, molto unix è insensato rispetto a Windows :D (roba da nerd ecc...)

Per le Pipe, naturalmente in Windows le apri e poi le usi come file (come dicevamo) e quindi si usa la stessa, per sempre.

Il discorso del polling ha un suo senso, se puoi spezzettare i task in unità semplici che non blocchino le operazioni più "critiche": è quello che avevo scritto parlando dei vari modi di fare "multitasking"
 
Top
view post Posted on 22/1/2020, 20:26
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Non so, io sono passato a Ubuntu come dicevo perchè mi sembra più stabile, poi per programmare era già tutto bello pronto gcc ecc...in ambiente Windows avevo provato il Dev c++, ma era baggato a dir poco, faceva come voleva...e ora sono rimasto a Ubuntu.
Bhò, spero di non arenarmi, sembrava semplice ma comporta un sacco di casini per come lo voglio fare io.
Pazienza non ho data di scadenza...almeno ci provo
 
Top
view post Posted on 30/1/2020, 20:04
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Se può interessare, credo di aver risolto. Questo programma genera 3 processi: 2 figli e un padre.
I figli a oltranza comunicano stringhe al padre, finchè il padre non riceve una stringa specifica che uccide i processi
figli.
CODICE
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include <string.h>

#define READ 0
#define WRITE 1

/* prova di 2 figli che comunicano col padre usando la stessa pipe
i figli leggono da input e scrivono al padre.
al padre quando arriva una determinata stringa uccide i processi
gila75 genn 2020

*/

void prova_pipe_w0(int pipe_out);
void prova_pipe_w1(int pipe_out);
void prova_pipe_r(int pipe_in);
void input_str (char str[]);



void input_str (char str[])
{
       int len_str;
       len_str=strlen(str);
       str[len_str-1]='\0';
}



void prova_pipe_w0(int pipe_out) //pipe0 figlio0(scrive)
{
       char buff[100];
       while(1)
       {
               fgets(buff,100,stdin);
               input_str(buff);
               printf ("in f0 %s\n",buff);
               write(pipe_out, buff, strlen(buff)+1); // scrivo  al padre
               
       }
}
//************************************************

void prova_pipe_w1(int pipe_out) //pipe0 figlio1(scrive)
{
       char buff[100];
       while(1)
       {
               fgets(buff,100,stdin);
               input_str(buff);
               printf ("in f1 %s\n",buff);
               write(pipe_out, buff, strlen(buff)+1); // scrivo  al padre
       }
}

void prova_pipe_r(int pipe_in) // pipe padre(legge)
{
       char buff [1024];
       int x;
       while(1)
       {
               read(pipe_in, buff, 1024); // leggo dai figli
               printf("padre riceve <%s>\n", buff);
               x=strcmp(buff,"fine");
               if (x==0)
                       break;
       }
       return ;
}
       

int main(int argc, char *argv[])
{
       int pid[2];
       int my_pipe[2];
       int x,status;
       // creo la pipe
       if (pipe(my_pipe)==-1)
       {
               puts("errore");
               return -1;
       }

       
       
//********************************************
//                        figlio 0
//********************************************
       
       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_w0(my_pipe[WRITE]); //passo descrittore pipe scrittura
       }    

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

       if ( pid[1] == 0 )
       {
               close (my_pipe[READ]);
               prova_pipe_w1(my_pipe[WRITE]); //passo descrittore pipe scrittura
       }    


       else // entro nel padre (main)
       {
               close(my_pipe[WRITE]); // chiudo scrittura
               prova_pipe_r(my_pipe[READ]); //apro lettura
       }

       kill(pid[0],1);
       x=wait(&status);
       printf (" processo %d finito con segnale %d\n",x,status);
       kill(pid[1],1);        
       x=wait(&status);
       printf (" processo %d finito con segnale %d\n",x,status);
       puts("fine");
       return 0;

}
 
Top
view post Posted on 30/1/2020, 20:07
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


"ha fatto Crono, ha fatto" :D

Bene, quindi sembra andare già in maniera più sensata!
 
Top
view post Posted on 30/1/2020, 20:19
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
"ha fatto Crono, ha fatto" :D

no ho capito... :D :D

Sono solo prove per implementare piccoli giochi con ncurses.
Ma come tutte le cose, sembrano facili, ma i problemi e le insidie sono molte
 
Top
view post Posted on 30/1/2020, 20:22
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


:D tu hai scritto "il padre uccide i figli" e mi è venuta in mente la mitologia greca!

e "ha fatto..." è un modo romanesco di dire, usato spesso da Lillo e Greg in modo esageratamente ironico
 
Top
view post Posted on 30/1/2020, 20:31
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


ah... :D avevo intuito qualcosa...ma sono un po' ignorante in merito
 
Top
view post Posted on 30/1/2020, 21:07
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


:) reminiscenze... e poi quale padre ucciderebbe i propi figli? al massimo gli mette in mano lo smartphone e se lo dimentica...
 
Top
view post Posted on 31/1/2020, 08:11
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Gia' la tattica di oggi. Che poi e' peggio di uccidere...
 
Top
view post Posted on 1/2/2020, 13:49
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Domanda:

buttando giù le basi di giochi rudimentali, come il bruco, guardie e ladri che usano i processi mi sono chiesto una cosa:
Ma come facevano ad andare i giochi negli anni 80 ?
Cioè un commodore 64 credo avrà montato uno z80 o qualcosa del genere.
La simultaneità come veniva gestita ?
Non so immaginiamo un gioco con 10 omini che fanno qualcosa indipendentemente.
Ognuno potrebbe essere un processo a parte...e quindi ?
Era magari un finta simultaneità ? un refresh velocissimo ?
Non so proprio...
Magari gli input esterni (tastiera, joistik ecc...) immagino saranno stati gestiti con interrupt, ma il programma
del gioco proprio non so come facevano.
Non ricordo nulla per esempio del basic simile a processi ,thread ecc...
 
Top
159 replies since 6/1/2020, 21:09   1137 views
  Share