diff --git a/3.nome_cognome_string/nc b/3.nome_cognome_string/nc new file mode 100755 index 0000000..d249e2c Binary files /dev/null and b/3.nome_cognome_string/nc differ diff --git a/3.nome_cognome_string/nc.c b/3.nome_cognome_string/nc.c new file mode 100644 index 0000000..6f885a4 --- /dev/null +++ b/3.nome_cognome_string/nc.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +int main (int index, char** in_data){ + + char buf[100]; + char bufn1[100]; + char bufn2[100]; + int num1,num2,sum; + + + fprintf (stdout,"Digitare 2 numeri separati da uno spazio\n"); + fscanf (stdin, "%99[^\n]%*c",buf); + sscanf (buf,"%s %s", bufn1, bufn2); + num1 = atoi(bufn1); + num2 = atoi(bufn2); + sum = num1 + num2; + + fprintf(stdout,"La somma e' %d\n", sum); + + + + fprintf (stdout,"Digitare un nome\n"); + fscanf (stdin, "%99[^\n]%*c",bufn1); + fprintf (stdout,"Digitare un cognome\n"); + fscanf (stdin, "%99[^\n]",bufn2); + + char bufsum[200]; + + + + strcpy(bufsum, bufn1); + strcat(bufsum, "-"); + strcat(bufsum, bufn2); + + fprintf(stdout,"%s\n",bufsum); + + + strcpy(bufsum, bufn2); + strcat(bufsum, "-"); + strcat(bufsum, bufn1); + fprintf(stdout,"%s\n",bufsum); + + + if (strcmp(bufn1,bufn2) == 0){ + fprintf(stdout,"Stringhe uguali\n"); + } else { + fprintf(stdout,"Stringhe diverse\n"); + } + + + char iniziali[3]; + iniziali[0] = bufn1[0]; + iniziali[1] = bufn2[0]; + iniziali[2] = 0; + + + fprintf(stdout,"Iniziali %s\n",iniziali); + + char code[150]; + char sumc[150]; + sprintf (sumc,"%d",sum); + + strcpy(code, iniziali); + strcat(code, sumc); + + fprintf(stdout,"Codice %s\n",code); + + + + + return 0; +} \ No newline at end of file diff --git a/3.nome_cognome_string/readme.txt b/3.nome_cognome_string/readme.txt new file mode 100644 index 0000000..7d13419 --- /dev/null +++ b/3.nome_cognome_string/readme.txt @@ -0,0 +1 @@ +il programma legge in in input prima due numeri restituendo la somma, poi un nome e congome formando diverse concatenazioni \ No newline at end of file diff --git a/4.file_read_count/copycount b/4.file_read_count/copycount new file mode 100755 index 0000000..0aa79f3 Binary files /dev/null and b/4.file_read_count/copycount differ diff --git a/4.file_read_count/copycount.c b/4.file_read_count/copycount.c new file mode 100644 index 0000000..0d4b90b --- /dev/null +++ b/4.file_read_count/copycount.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int main (int index, char** in_data){ + + + int fd,fd2,ridden,wrote, tot,vocali,cifre,righe; + tot = vocali = cifre = righe = 0; + char buf; + fd = open ("sample",O_RDONLY); + fd2 = open ("sample_copied", O_CREAT | O_WRONLY,00700); + if (fd < 0){ + fprintf(stderr,"Error reading file %d\n",errno); + exit(-1); + } + if (fd2 < 0){ + fprintf(stderr,"Error creating file %d\n",errno); + exit(-1); + } + + for (ridden = read (fd,&buf,1) ; ridden == 1 ;ridden = read (fd,&buf,1)){ + + + if (isdigit(buf) != 0){ + cifre++; tot++; + wrote = write (fd2,&buf,1); + if (wrote != 1){ + fprintf(stderr,"Error writing to file %d\n",errno); + exit(-1); + } + continue; + } + + if (buf == 'a' || buf == 'e' || buf == 'i' || buf == 'o' || buf == 'u'){ + vocali++;tot++; + wrote = write (fd2,&buf,1); + if (wrote != 1){ + fprintf(stderr,"Error writing to file %d\n",errno); + exit(-1); + } + continue; + } + + if (buf == '\n'){ + righe++;tot++; + wrote = write (fd2,&buf,1); + if (wrote != 1){ + fprintf(stderr,"Error writing to file %d\n",errno); + exit(-1); + } + continue; + } + + + tot++; + wrote = write (fd2,&buf,1); + if (wrote != 1){ + fprintf(stderr,"Error writing to file %d\n",errno); + exit(-1); + } + + + } + + if (ridden < 0){ + fprintf(stderr,"Error reading file %d\n",errno); + exit(-1); + } + + fprintf (stdout, "Numero vocali %d\n", vocali); + fprintf (stdout, "Numero righe %d\n", righe); + fprintf (stdout, "Numero cifre %d\n", cifre); + fprintf (stdout, "Numero caratteri %d\n", tot); + + close(fd);close(fd2); + + + return 0; +} \ No newline at end of file diff --git a/4.file_read_count/readme.txt b/4.file_read_count/readme.txt new file mode 100644 index 0000000..b4ccd4e --- /dev/null +++ b/4.file_read_count/readme.txt @@ -0,0 +1 @@ +il programma legge il file sample e lo ricopia in sample_copied contango righe,vocali,numeri e caratteri \ No newline at end of file diff --git a/4.file_read_count/sample b/4.file_read_count/sample new file mode 100644 index 0000000..631333f --- /dev/null +++ b/4.file_read_count/sample @@ -0,0 +1,6 @@ +aafdsfdsfdfdfdfdf +4343 +fdsd342 +fdfdsfFJSNJNDJS +dfdsfa + diff --git a/4.file_read_count/sample_copied b/4.file_read_count/sample_copied new file mode 100755 index 0000000..631333f --- /dev/null +++ b/4.file_read_count/sample_copied @@ -0,0 +1,6 @@ +aafdsfdsfdfdfdfdf +4343 +fdsd342 +fdfdsfFJSNJNDJS +dfdsfa + diff --git a/4.file_read_count/sample~ b/4.file_read_count/sample~ new file mode 100644 index 0000000..0cb7e0b --- /dev/null +++ b/4.file_read_count/sample~ @@ -0,0 +1,6 @@ +fdsfdsfdfdfdfdf +4343 +fdsd342 +fdfdsfFJSNJNDJS +dfdsf + diff --git a/5.list_file_directory/list b/5.list_file_directory/list new file mode 100755 index 0000000..bc51c77 Binary files /dev/null and b/5.list_file_directory/list differ diff --git a/5.list_file_directory/list.c b/5.list_file_directory/list.c new file mode 100644 index 0000000..f0ce9cb --- /dev/null +++ b/5.list_file_directory/list.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int main (int index, char** in_data){ + + if (index < 2){ + fprintf(stderr,"Please specify a directory into command line\n"); + exit(-1); + } + + if (index > 2){ + fprintf(stderr,"Please enter only 1 path\n"); + exit(-1); + } + + + char * path; + path = *(in_data + 1); + + DIR * directory; + directory = opendir (path); + if ( directory == NULL){ fprintf(stderr, "Not a directory\n"); exit(-1);} + + + struct dirent * dir_entry; + struct stat file_stat; + char full_path [2048]; + + int fd,ridden; + char buf[10]; + + for(dir_entry = readdir(directory); + dir_entry != NULL; + dir_entry = readdir(directory)){ + + strcpy (full_path,path); + strcat (full_path,"/"); + strcat (full_path,dir_entry->d_name); + + if (stat (full_path,&file_stat) != 0 ) {fprintf(stderr, "Error retrieving file info\n"); exit(-1);} + + fprintf (stdout,"Name %20s",dir_entry->d_name); + fprintf (stdout," / "); + fprintf (stdout,"Inode %10d",file_stat.st_ino); + fprintf (stdout," / "); + fprintf (stdout,"Size %10d",file_stat.st_size); + fprintf (stdout," / "); + + if (S_ISREG (file_stat.st_mode)){ + fprintf (stdout,"%23s","Regular File / "); + fd = open (full_path,O_RDONLY); + if (fd < 0){ + fprintf(stderr,"Error reading file %s %d\n",dir_entry->d_name,errno); + exit(-1); + } + ridden = read (fd,buf,10); + buf[ridden] = 0; + fprintf (stdout,"%10s",buf); + + close (fd); + } else { + fprintf (stdout,"%23s","Not a Regular File / "); + + } + fprintf (stdout,"\n"); + + } + + if (errno != 0){ + fprintf(stderr, "Error reading in the directory\n"); exit(-1); + } + + + + return 0; +} \ No newline at end of file diff --git a/5.list_file_directory/readme.txt b/5.list_file_directory/readme.txt new file mode 100644 index 0000000..424cf2b --- /dev/null +++ b/5.list_file_directory/readme.txt @@ -0,0 +1 @@ +il programma legge da liena di ocmando il percorso di una directory e fornisce in output statistiche relative ai file: nome,inode,grandezza in byte, check se il file e' regolare e in tal caso i primi 10 caratteri \ No newline at end of file diff --git a/6.process_and_signal/file_communication b/6.process_and_signal/file_communication new file mode 100755 index 0000000..d8b49ca Binary files /dev/null and b/6.process_and_signal/file_communication differ diff --git a/6.process_and_signal/file_communication.c b/6.process_and_signal/file_communication.c new file mode 100644 index 0000000..2a1265f --- /dev/null +++ b/6.process_and_signal/file_communication.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +void sigusr1action (int signal){ + + fprintf(stdout,"Parent:Ricevuto SIGUSR1\n"); + +} + +void sigusr1caction (int signal){ + + fprintf(stdout,"Child:Ricevuto SIGUSR1\n"); + int fd; + fd = open ("share_file", O_RDWR | O_APPEND); + if (fd < 0){ + fprintf(stderr,"Child: Error reading file - Errno%d\n",errno); + kill(getpid(),SIGKILL); + } + char a [100]; + char b [100]; + char op; + lseek(fd,0,SEEK_SET); + char data[2]; + data[1]=0; + char input[100]=""; + for (read(fd,data,1);data[0]!='\n';read(fd,data,1)){ + strcat(input,data); + } + sscanf(input,"%s%*c%s%*c%c",a,b,&op); + + int a_data, b_data,calcolo; + char calcolo_s[100]; + + a_data= atoi(a); + b_data = atoi(b); + + if (op=='+'){ + calcolo = a_data + b_data; + }else{ + if (op=='-'){ + calcolo = a_data - b_data; + }else{ + if (op=='*'){ + calcolo = a_data * b_data; + }else{ + + calcolo = a_data / b_data; + + } + } + } + sprintf(calcolo_s,"%d",calcolo); + write (fd,calcolo_s,strlen(calcolo_s)); + + kill(getppid(),SIGUSR1); +} + + + + +int main (int index, char** in_data){ + + if (index < 4 || index > 4) { + fprintf(stderr,"Parametri command line non validi\n"); + exit(-1); + } + + int duplicate; + duplicate = fork(); + if (duplicate < 0) + exit(-1); + if (duplicate == 0){ + //child + + + + struct sigaction sigusr1cstructure; + sigusr1cstructure.sa_handler = sigusr1caction; + sigusr1cstructure.sa_flags = 0; + + + + sigaction (SIGUSR1, &sigusr1cstructure, NULL); + pause(); + + fprintf(stdout,"Child:Process %d terminated\n",getpid()); + + }else{ + // parent + + int fd; + fd = open ("share_file", O_CREAT | O_WRONLY | O_EXCL,00700); + if (fd < 0){ + fprintf(stderr,"Parent:Share_file already exists\n"); + fd = open ("share_file", O_WRONLY | O_TRUNC); + if (fd < 0){ + fprintf(stderr,"Parent:Error writing to file - Err no%d\n",errno); + char cmd [100] = "kill -P "; + char pid [10]; + sprintf (pid,"%d",getpid()); + strcat(cmd,pid); + system(cmd); + + } + } + + write (fd,*(in_data+1),strlen(*(in_data+1))); + write (fd," ",1); + write (fd,*(in_data+2),strlen(*(in_data+2))); + write (fd," ",1); + write (fd,*(in_data+3),strlen(*(in_data+3))); + write (fd,"\n",1); + + close(fd); + + + struct sigaction sigusr1structure; + sigusr1structure.sa_handler = sigusr1action; + sigusr1structure.sa_flags = 0; + + + + sigaction (SIGUSR1, &sigusr1structure, NULL); + + int status; + int pid; + + kill (duplicate,SIGUSR1); + + for (pid = waitpid(-1,&status,0);pid > 0;pid = waitpid(-1,&status,0)){ + fprintf(stdout,"Parent:Child %d terminated\n",pid); + } + + fprintf(stdout,"Parent:Process %d terminated\n",getpid()); + + } + + + + return 0; +} + diff --git a/6.process_and_signal/readme.txt b/6.process_and_signal/readme.txt new file mode 100644 index 0000000..e22bd09 --- /dev/null +++ b/6.process_and_signal/readme.txt @@ -0,0 +1,2 @@ +waitc : il parent crea un figlio. Quest'ultimo riceve un numero da terminale e subito manda un sigusr1 al padre. Il parent attende un usr1 o un sigchld e poi termina. +file_communication : il parent crea un figlio e si comportano come un client server. Da linea di comando si passano tre paramentri: 2 numeri e una operazione. Esempio: 10 5 + . Le operazioni supportate sono + - * /. il file share_file viene utilizzato come file di sharing in cui il server mette i dati e il client la risposta. Il server informa il clinet mediane un usr1 qunado i file sono pronti mentre il client risponde con un usr1 al parent qunado ha completato l'operazione \ No newline at end of file diff --git a/6.process_and_signal/share_file b/6.process_and_signal/share_file new file mode 100755 index 0000000..8bccfef --- /dev/null +++ b/6.process_and_signal/share_file @@ -0,0 +1,2 @@ +152 11 - +141 \ No newline at end of file diff --git a/6.process_and_signal/waitc b/6.process_and_signal/waitc new file mode 100755 index 0000000..231ba34 Binary files /dev/null and b/6.process_and_signal/waitc differ diff --git a/6.process_and_signal/waitc.c b/6.process_and_signal/waitc.c new file mode 100644 index 0000000..3ab6823 --- /dev/null +++ b/6.process_and_signal/waitc.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void sigusr1action (int signal){ + + fprintf(stdout,"Parent:Ricevuto SIGUSR1\n"); + +} + +void sigchldaction (int signal){ + + fprintf(stdout,"Parent:Ricevuto SIGCHLD\n"); + + +} + + +int main (int index, char** in_data){ + + int duplicate; + duplicate = fork(); + if (duplicate < 0) + exit(-1); + if (duplicate == 0){ + //child + + int numero; + fscanf(stdin,"%d",&numero); + kill (getppid(),SIGUSR1); + fprintf(stdout,"Child:Process %d terminated\n",getpid()); + + }else{ + // parent + + struct sigaction sigusr1structure; + sigusr1structure.sa_handler = sigusr1action; + sigusr1structure.sa_flags = 0; + + + struct sigaction sigchldstructure; + sigchldstructure.sa_handler = sigchldaction; + sigchldstructure.sa_flags = 0; + + + sigaction (SIGUSR1, &sigusr1structure, NULL); + sigaction (SIGCHLD, &sigchldstructure, NULL); + + int status; + int pid; + + for (pid = waitpid(-1,&status,0);pid > 0;pid = waitpid(-1,&status,0)){ + fprintf(stdout,"Parent:Child %d terminated\n",pid); + } + + fprintf(stdout,"Parent:Process %d terminated\n",getpid()); + } + + + + + return 0; +} + diff --git a/da_vedere b/da_vedere index 1e92fc6..0a158aa 100644 --- a/da_vedere +++ b/da_vedere @@ -11,7 +11,6 @@ clear: rm -f -- per esempio - struct ind_addr struct sockaddr_in castato in struct sockaddr @@ -25,3 +24,5 @@ funzione int socket().. esercizio con scambo dati tra due processi mediante file e comunicazione mediante segnali +======= +piu file di giannino per i socket, vedi anche fli fopen,etc sugli stream diff --git a/da_vedere~ b/da_vedere~ new file mode 100644 index 0000000..72c4b58 --- /dev/null +++ b/da_vedere~ @@ -0,0 +1,13 @@ +nel make file +@echo compilazione di $< in $@ + +FLAG1= -c + +FLAG2 = -o + + + +clear: + rm -f -- per esempio + +piu file di giannino per i socket diff --git a/test/gino b/test/gino new file mode 100755 index 0000000..513e29c --- /dev/null +++ b/test/gino @@ -0,0 +1,2 @@ +ehehifdgfdgdf +ehi \ No newline at end of file diff --git a/test/gino~ b/test/gino~ new file mode 100755 index 0000000..e69de29 diff --git a/test/test b/test/test index ea20455..a3cc6fb 100755 Binary files a/test/test and b/test/test differ diff --git a/test/test.c b/test/test.c index 59a2288..e31bd4f 100644 --- a/test/test.c +++ b/test/test.c @@ -1,18 +1,25 @@ -#include -#include +#include +#include #include #include -#include +#include +#include #include -#include int main (int index, char** in_data){ + int fd; + int data; + void * buf; + buf = malloc (100); + fd = open ("gino",O_WRONLY | O_APPEND,00700); + lseek (fd,2,SEEK_SET); + write (fd,(void *)"ehi",3); + - - + close(fd); return 0;