Difference between revisions of "SYS CALL viste a lezione."
Jump to navigation
Jump to search
Line 56: | Line 56: | ||
Correggetemi se ho scritto delle sciocchezze. | Correggetemi se ho scritto delle sciocchezze. | ||
(Pirata) | (Pirata) | ||
+ | |||
+ | * WAIT | ||
+ | Aspetta che un processo cambi di stato. | ||
+ | |||
+ | esempio1: | ||
+ | <syntaxhighlight lang="C"> | ||
+ | #include <stdio.h> | ||
+ | #include <unistd.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <sys/wait.h> | ||
+ | |||
+ | int main (int argc, char* argv[]){ | ||
+ | pid_t pid; | ||
+ | if( pid = fork() ){ | ||
+ | int status; | ||
+ | printf(" padre : %d figlio : %d \n",getpid(),pid); | ||
+ | waitpid(pid,status,0); | ||
+ | printf(" exit status %d \n",WEXITSTATUS(status)); | ||
+ | } | ||
+ | else { | ||
+ | printf(" figlio : %d padre : %d \n",getpid(),getppid()); | ||
+ | sleep(1); | ||
+ | exit(1); | ||
+ | } | ||
+ | } |
Revision as of 23:58, 8 November 2013
- FORK
Crea un nuovo processo duplicando il processo chiamante. Il nuovo processo , chiamato figlio, é un duplicato esatto del processo chiamante , chiamato padre.
esempio1:
#include <stdio.h>
#include <unistd.h>
void main (void){
if(fork()){
printf("uno %d %d \n", getpid(), getppid() ); // getpid() stampa il pid del processo corrente , getppid() stampa il pid del processo padre
sleep(2);} //se togliessimo lo sleep;il processo figlio stamperebbe come getppid() 1,perché essendo il padre terminato e lui rimasto orfano,il nuovo padre diventa init
else
printf("due %d %d \n",getpid(), getppid() );
}
esempio2(una piccola osservazione sull'eredità del buffer):
#include <stdio.h>
#include <unistd.h>
void main (void){
printf("cucù! : "); //notare la differenza se nella sringa metto \n
if(fork())
printf("uno %d %d \n", getpid(), getppid() );
else
printf("due %d %d \n",getpid(), getppid() );
}
esempio3(fork e malloc):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void main (void){
int *p;
if( fork() ){
p = malloc(sizeof(int));
*p = 45;
printf("%d %p pid : %d , ppid : %d \n",*p,p,getpid(),getppid());
sleep(2);
}
else {
p = malloc(sizeof(int));
printf("%d %p pid : %d , ppid : %d \n",*p,p,getpid(),getppid()); //i puntatori restituiranno lo stesso indirizzo di memoria sia per il padre che per il figlio perché condividono lo stesso spazio di indirizzamento
sleep(1);
}
}
Correggetemi se ho scritto delle sciocchezze. (Pirata)
- WAIT
Aspetta che un processo cambi di stato.
esempio1: <syntaxhighlight lang="C">
- include <stdio.h>
- include <unistd.h>
- include <stdlib.h>
- include <sys/types.h>
- include <sys/wait.h>
int main (int argc, char* argv[]){ pid_t pid; if( pid = fork() ){ int status; printf(" padre : %d figlio : %d \n",getpid(),pid); waitpid(pid,status,0); printf(" exit status %d \n",WEXITSTATUS(status)); } else { printf(" figlio : %d padre : %d \n",getpid(),getppid()); sleep(1); exit(1); } }