Difference between revisions of "Esercizi con System Call"

From Sistemi Operativi
Jump to navigation Jump to search
Line 27: Line 27:
  
 
([[User:Simone|Simone]])
 
([[User:Simone|Simone]])
 +
 +
== programma 1 ==
 +
Open() Write() Read()
 +
 +
<syntaxhighlight lang="C">
 +
/*IL PROGRAMMA APRE UN FILE SUL QUALE FA DELLE OPERAZIONI DI LETTURA E SCRITTURA*/
 +
#include <sys/types.h>
 +
#include <sys/stat.h>
 +
#include <fcntl.h>
 +
#include <stdio.h>
 +
#include <errno.h>
 +
#include <stdlib.h>
 +
#include <unistd.h>
 +
 +
#define MAX_CHAR 100000
 +
 +
int main(int argc, char *argv[]){
 +
 +
int fd, c, n_read;
 +
int fine = EOF;
 +
        int index = 0;
 +
char arr[MAX_CHAR];
 +
char c_arr_read[MAX_CHAR];
 +
const char *path = //inserisci qui il percorso del file che vuoi aprire, se il file specificato non esiste, la open fallisce e il
 +
                          //programma termina con un codice di errore
 +
fd = open(path, O_RDWR);
 +
 +
if(fd == -1){
 +
printf("fd: %d\n", fd);
 +
printf("Open failed, Err: %d\n", errno);
 +
exit(1);
 +
}
 +
 +
if( (n_read = read(fd, &c_arr_read, MAX_CHAR)) > 0 ) {
 +
printf("file non vuoto\nbytes letti: %d\n", n_read);
 +
write(fd, &fine, 0);
 +
} else printf("file vuoto\nbytes letti: %d\n", n_read);
 +
 +
//printf("fd: %d\n", fd);
 +
printf("Open().\n");
 +
while((c = getchar()) != EOF && index < MAX_CHAR){
 +
arr[index] = c;
 +
index++;
 +
}
 +
//printf("sizeof arr: %d\n", sizeof(arr));
 +
write(fd, &arr, index);
 +
 +
return 0;
 +
}
 +
</syntaxhighlight>
 +
 +
 +
([[User:Alessio|Alessio]])

Revision as of 22:44, 24 November 2015

Questi programmi contengono esempi di uso delle System-Call.

Il consiglio e' di compilarli, provarli e capirne passo-passo il funzionamento. (o spiegare perche' non funzionino).

Ovviamente potete proporre ulteriori esempi. Renzo (talk) 08:03, 2 November 2015 (CET)

programma 0

Il gatto di Schrödinger: Fork e' vero o falso?

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
  if (fork())
    printf("fork is true\n");
  else
    printf("fork is false\n");
  usleep(100000);
  return 0;
}


il programma stampa entrambi i risultati perché la system call fork() crea un processo figlio identico al padre, questa system call ha come valore di ritorno al thread padre il pid del processo figlio (che essendo diverso da 0 è true) e al thread figlio ritorna 0, quindi il processo padre riceve un valore diverso da 0 (pid del figlio) e stampa true, mentre il processo figlio riceve 0, non entra nel if e stampa, ovviamente false.

(Simone)

programma 1

Open() Write() Read()

/*IL PROGRAMMA APRE UN FILE SUL QUALE FA DELLE OPERAZIONI DI LETTURA E SCRITTURA*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_CHAR 100000

int main(int argc, char *argv[]){
	
	int fd, c, n_read;
	int fine = EOF;
        int index = 0;
	char arr[MAX_CHAR];
	char c_arr_read[MAX_CHAR];
	const char *path = //inserisci qui il percorso del file che vuoi aprire, se il file specificato non esiste, la open fallisce e il 
                           //programma termina con un codice di errore
	fd = open(path, O_RDWR);

	if(fd == -1){
		printf("fd: %d\n", fd);
		printf("Open failed, Err: %d\n", errno);
		exit(1);
	} 

	if( (n_read = read(fd, &c_arr_read, MAX_CHAR)) > 0 ) {
		printf("file non vuoto\nbytes letti: %d\n", n_read);
		write(fd, &fine, 0);
	} else printf("file vuoto\nbytes letti: %d\n", n_read);

	//printf("fd: %d\n", fd);
	printf("Open().\n");
	while((c = getchar()) != EOF && index < MAX_CHAR){
		arr[index] = c;
		index++;
	}
	//printf("sizeof arr: %d\n", sizeof(arr));
	write(fd, &arr, index);
	
	return 0;
}


(Alessio)