Difference between revisions of "SYS CALL viste a lezione."

From Sistemi Operativi
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">

  1. include <stdio.h>
  2. include <unistd.h>
  3. include <stdlib.h>
  4. include <sys/types.h>
  5. 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); } }