Pages: 1 [2] 3   Go Down
Print
Author Topic: Programmazione C: domande  (Read 12203 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #15 on: 21-07-2012, 13:21:08 »

Quote
Quindi ad ogni fork() sono generati 2 processi.

E quindi perchè i processi sono 3? Dato che abbiamo due fork() non dovrebbero essere 4?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #16 on: 21-07-2012, 14:46:38 »

Quote
Quindi ad ogni fork() sono generati 2 processi.

E quindi perchè i processi sono 3? Dato che abbiamo due fork() non dovrebbero essere 4?
Se leggi bene nei miei interventi precedenti, vedrai che ho risposto puntualmente a quella domanda, correggendone l'affermazione.

Leggere per credere...
La chiamata fork() non fa altro che duplicare un processo. Dopo tale chiamata , se avvenuta con successo, vengono generati due processi, il processo padre e il processo figlio.
Quindi ad ogni fork() sono generati 2 processi.   ciao
In realtà il processo generato è solo uno (il figlio), l'altro (il padre) esisteva già e mantiene il PID che aveva prima della invocazione a fork.
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #17 on: 21-07-2012, 14:51:53 »

Premetto che sto ripassando altro e che la parte di laboratorio la devo vedere domani....però:

Code:
int main(){
   
    printf("ciao");
    pid_t pid; pid_t pid2;
    pid = fork();
    pid2=fork();
}

Qual è la dinamica? Cioè c' è il padre che genera il primo figlio, PID, e poi lo stesso padre genera PID2? Come faccio a capire che hanno lo stesso padre quei due processi?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #18 on: 21-07-2012, 15:08:13 »

Premetto che sto ripassando altro e che la parte di laboratorio la devo vedere domani....però:

Code:
int main(){
   
    printf("ciao");
    pid_t pid; pid_t pid2;
    pid = fork();
    pid2=fork();
}

Qual è la dinamica? Cioè c' è il padre che genera il primo figlio, PID, e poi lo stesso padre genera PID2? Come faccio a capire che hanno lo stesso padre quei due processi?
Se non ho capito male, pid e pid2 duplicano lo stesso processo, ovvero il processo stesso contenuto dentro il main. In teoria hanno lo stesso padre.
Ma prendi l'informazione con le pinze, non so se è giusta.
Logged
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #19 on: 21-07-2012, 16:18:52 »


Se non ho capito male, pid e pid2 duplicano lo stesso processo, ovvero il processo stesso contenuto dentro il main. In teoria hanno lo stesso padre.
Ma prendi l'informazione con le pinze, non so se è giusta.

si è cosi... guarda il file multiforkwait.c per rendertene conto
Logged

Aliens Exist
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #20 on: 21-07-2012, 19:23:13 »


Se non ho capito male, pid e pid2 duplicano lo stesso processo, ovvero il processo stesso contenuto dentro il main. In teoria hanno lo stesso padre.
Ma prendi l'informazione con le pinze, non so se è giusta.

si è cosi... guarda il file multiforkwait.c per rendertene conto
chuck per la chiamata close(1) che mi sai dire? basta quella in un qualsiasi codice per non far stampare nesusna print? non c'è modo di riaprire l'output?
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #21 on: 21-07-2012, 20:01:41 »

E il processo contenuto nel main qual è?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #22 on: 21-07-2012, 22:08:22 »

non c'è modo di riaprire l'output?
Sinceramente non lo so boh, ma direi di non preoccuparti (almeno per adesso) giacché questo livello di conoscenze è eccessivamente approfondito per quello che ti serve sapere da questa materia .

E il processo contenuto nel main qual è?
Questa domanda non ha senso. "main" è una funzione. Le funzioni non contengono processi, semmai il contrario (e sarebbe anche un abuso di terminologia dirlo).
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #23 on: 21-07-2012, 22:30:27 »

Quote
Questa domanda non ha senso. "main" è una funzione. Le funzioni non contengono processi

Appunto!!!

Quindi io vedo pid e pid2, come due processi....quando è fatta la fork() non sono loro rispettivamente i padri che duplicano se stessi?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Sickboy
Matricola
*
Offline Offline

Gender: Male
Posts: 41



« Reply #24 on: 22-07-2012, 12:13:23 »

Guardate l'esempio multifork nelle dispense del prof, testatelo così capite meglio cosa accade al momento delle chiamate fork.
Logged
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #25 on: 22-07-2012, 13:08:32 »

Guardate l'esempio multifork nelle dispense del prof, testatelo così capite meglio cosa accade al momento delle chiamate fork.
io non ci ho capito molto..
Code:
#include <stdio.h>
#include <stdlib.h>
int main() {
pid_t pid;
int i;
pid = fork(); // creo un primo figlio
if (pid == 0) {
// processo figlio 1
for (i=0; i<20; i++) {
sleep(rand()%2);
printf("Sono il FIGLIO 1.\n"); }
exit(0);
}
pid = fork(); // creo un secondo figlio
if (pid == 0) {
// processo figlio 2
for (i=0; i<20; i++) {
sleep(rand()%2);
printf("Sono il FIGLIO 2.\n"); }
exit(0);
}
// processo padre
for (i=0; i<20; i++) {
sleep(rand()%2);
printf("Sono il PADRE.\n"); }
exit(0);
}
exit(0) chiude il processo che ha il pid uguale a 0?

inoltre approfitto per fare una domanda sulla close.. se in questo codice fuori da un ciclo scrivo close(1) vuol dire che chiude l'output del processo che ha pid 1? come faccio a chiudere l'output del primo figlio?
« Last Edit: 22-07-2012, 13:28:07 by milos224 » Logged
Sickboy
Matricola
*
Offline Offline

Gender: Male
Posts: 41



« Reply #26 on: 22-07-2012, 13:53:35 »

Guardate l'esempio multifork nelle dispense del prof, testatelo così capite meglio cosa accade al momento delle chiamate fork.
io non ci ho capito molto..
Code:
#include <stdio.h>
#include <stdlib.h>
int main() {
pid_t pid;
int i;
pid = fork(); // creo un primo figlio
if (pid == 0) {
// processo figlio 1
for (i=0; i<20; i++) {
sleep(rand()%2);
printf("Sono il FIGLIO 1.\n"); }
exit(0);
}
pid = fork(); // creo un secondo figlio
if (pid == 0) {
// processo figlio 2
for (i=0; i<20; i++) {
sleep(rand()%2);
printf("Sono il FIGLIO 2.\n"); }
exit(0);
}
// processo padre
for (i=0; i<20; i++) {
sleep(rand()%2);
printf("Sono il PADRE.\n"); }
exit(0);
}
exit(0) chiude il processo che ha il pid uguale a 0?

la funzione exit prevede un parametro attraverso il quale il processo che termina comunica al padre informazioni sul suo stato di terminazione. exit(0) indica lo stato di corretta terminazione. exit(-1) indica la terminazione con errore.

http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
« Last Edit: 22-07-2012, 14:16:35 by Sickboy » Logged
Chuck_son
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 1.583



WWW
« Reply #27 on: 22-07-2012, 14:03:48 »

.cominciamo dal fatto che pid 0 è il processo INIT ...... il pid 0 viene restituito da fork() al figlio.. al padre viene restituito il pid del figlio creato... il pid del padre si ottiene dal processo figlio tramite getppid()
Logged

Aliens Exist
Sickboy
Matricola
*
Offline Offline

Gender: Male
Posts: 41



« Reply #28 on: 22-07-2012, 14:15:49 »

Guardate l'esempio multifork nelle dispense del prof, testatelo così capite meglio cosa accade al momento delle chiamate fork.
inoltre approfitto per fare una domanda sulla close.. se in questo codice fuori da un ciclo scrivo close(1) vuol dire che chiude l'output del processo che ha pid 1? come faccio a chiudere l'output del primo figlio?
La chiamata int close(int fd) serve per chiudere un fi le, libera il descrittore del file fd e la relativa voce nella tabella dei file aperti.

http://www.dmi.unict.it/diraimondo/uploads/classes/so/1011/SO-lab-unix-programming-video.pdf
Logged
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #29 on: 22-07-2012, 14:52:27 »

Guardate l'esempio multifork nelle dispense del prof, testatelo così capite meglio cosa accade al momento delle chiamate fork.
inoltre approfitto per fare una domanda sulla close.. se in questo codice fuori da un ciclo scrivo close(1) vuol dire che chiude l'output del processo che ha pid 1? come faccio a chiudere l'output del primo figlio?
La chiamata int close(int fd) serve per chiudere un fi le, libera il descrittore del file fd e la relativa voce nella tabella dei file aperti.

http://www.dmi.unict.it/diraimondo/uploads/classes/so/1011/SO-lab-unix-programming-video.pdf
Si ma come mai
Code:
int main(){
printf("ciao");
close(1);
printf("rosso");
}
non stampa nulla? cosa si deve fare per far stampare rosso, senza togliere il close?
Logged
Pages: 1 [2] 3   Go Up
Print
Jump to: