From 695cc7dc351e8a64d72baf463203cc92f9559b61 Mon Sep 17 00:00:00 2001 From: xgiovio Date: Sun, 23 Mar 2014 19:35:49 +0100 Subject: [PATCH] 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 --- 6.process_and_signal/file_communication | Bin 0 -> 13761 bytes 6.process_and_signal/file_communication.c | 121 ++++++++++++++++++---- 6.process_and_signal/readme.txt | 2 + 6.process_and_signal/share_file | 2 + da_vedere | 2 +- da_vedere~ | 13 +++ 6 files changed, 119 insertions(+), 21 deletions(-) create mode 100755 6.process_and_signal/file_communication create mode 100644 6.process_and_signal/readme.txt create mode 100755 6.process_and_signal/share_file create mode 100644 da_vedere~ diff --git a/6.process_and_signal/file_communication b/6.process_and_signal/file_communication new file mode 100755 index 0000000000000000000000000000000000000000..d8b49cac71e8626a9d56ab7f5b4adbfcc8e7c82d GIT binary patch literal 13761 zcmeHOeQ;FQb-%kSfe;1>@o6CD*_B*Dtu^9P*f?1s37)8I6h2aH>^zp;m9%EHtJ!@E zk|%cL$V>dZQ7UJOhsk6nq~q~0ai^tiLcke>02kqDaplR3gQsb$cuc)(oCbdZ#vkhM z+;{Kpdk?*7o0S?qu1kMGI`lo8F6Ff0S=j0#;)AS zS%EdMX)M6*V2jukAf@;PcnMK6C+T(3w4`OCo)5GHzXq=fG|?xu%!aFgUXE&xY1&%uv; zfXXkVA8vei&m+NYcirFj&ksC(?5(-27pVU2_)#0YUzG7wdI?*I-_oyqZ}GYhv(i0) z*i#T}l^x>TOD_0f7yLmNoW_5$_7Az>&$!?xUGSs}KIVd-cfo1c6#SfNJAldT-|vF| zu?zll7yPUXe$)kj&IMoMf)F2E3EY+9NBi*cHe=@40Vze_D;?hAq5oP;>QLZQyOQ4lRPbAJd3Wib-M0dJ_ z(Ky@G*1DldTj5_@$gL{mR`^$AT)g7XSI7}!;w3gr*7Rb1`xxyN^rJLC8l6Eq#M{Ud zHiz>*_P*fL3!~Gh#jD^cjW5~FDeV!r@tk>)^G0U{?HMx3c_W;BrI5sYP6a?~My4_g zPJNN7(t`UW2)e+6%e|S36$@@XziKVGb^l&&!O13>8Z5Z3+&Jvjp zS#WWL@}k2QT-+jX{D=jgFB<_pYQgEul1UwSzbtna9+KM%cgWRYOx1x`%g)O3iPb-x zr?82dAK_ZDB!C?8T~wSOpFpbl0rBKw`7zEvM?AS!euVSiA>K#)QO-X>Jh@W-Fz1uR zlMCgCIR7~Do>hlXe_)okfoa}=g#Ms)AQ7@x`^Yuce2m$p&G{s)di z5ljE+F9Wy*gxF8Ps!v~TAnx>MK6T)-M_qR@Rozjsq?y4fMm(xfnn9(BIsd>bWlQ&y z$hwQkx6hS^koAzdU5}mZ=;-iQETKCDl6&B274(o^z3MoJU|ZQ^r&K7K7=P^S&=8fu zq)Ow-&tXS7HENtWK0^I8-gt$)b(s81HAZt6(9_q>a)GDczXH@axfoDb&6d>E@;WWo z>qpSat278`yOlzRpW-?RR_+LsDp#cAtKr{`~Nyx`|R_HiOZ`YO{MA}Z%;Meq`~QdA~&&D zAy#oLLqhAz(<8$*)F&Z5c=Bt!t-+(591MW88rKUQy$D&q@JxGew!ImM_C{EWN-V0!(nMxE>A_w7fksTxmGw|VG ztHyct+L$`njs_kaGKU|{po@2YhWWk+tqjxd0^l$JHQRDMtgbY@PcO|a23BxTx?3B{=bPk~J24x&In>0RV?P=0B8fQ@F3AjkWR$w!uZs%o4&MSaToZ$S1fx-{croH?<} zbp3s^$fn|0zJSvFec04r8G&aGpN6buDV-$ATaQV(EPXfdVp`yPMc7_cLsq*pzAI zmtnXmS-g%Qr`K7<%CdYIP5=AJb=nSSKwqKlVE8py2QPdMa8Xy~AEpapHeIVH*L8NQk?BJAa^r~$raL`5Q^6iWn04a+l1!Ma39{d8V&EhRv2P#Cl@fO5 zMBZ$0EgG~o^=Bv*8_y2fJ?8MU3%kd^U8UW_dS0tWtomY`5w3>A)iq65SleLDdLqDc zZH8WbrOo(OHTLR9t8v=D-_W-7Qls%jt8rC5{e`d9_;qd(np88t(-+tO3*Eo988_OD ztIfvm8z<)cMjbedGyZb=JvIAiHM}%dUD=imS1)KoPHD^P)wONeZ&feHvEFdDVo5&@ z+($O+%(I){PhfQ)DMvR4u21N<|B_xqiTj4jWw;N?;(p@#MEV19hhW~T&sbFS2Px$1W$EALhFdeB3$0ArnDrJiKIf0 zl+k#nLZwO_f$>C5xSZ9bYLkCZ z(t`G6A{0rbl$x-jN0QyqcuF_ zB6O0C3M(|q`{bg~#T@2YCla|`tiiXPSC%CEA)f@E9ha+r?5+nfS$*F!#L

E&avJ#6DE|pfy)5_r$V)Xy$20gH!}|PciM4!P z36)m^dJ(^Iy6*sGU;kd|fhpR|z`)c$_kQ0uSmNC|lk`wO{s})7eKb7`%&l~51a6JM ztr5620=Gus)(HH+90A;?^CUa(BS+X<Jl!KvQcZ&I;AWEgaZAYi(=X~{oH#GX<%-}pi*h0Ue@^80YNw(OF)#ZB zJs{`{g1#i^F+tA>`lg`&A?Q^>r<4b{ig|+GE$A9SHwyXIx>*~`ST)ouf8S|(5y7k~5P(5kVE}6qO zx=6Bz`Qr&a;&0s0TBip)1=kr*`}d^rOjU=Eaem^uf~hX%5BJ5%94>-kOV}oC#ExhG>*@Mem&BQYX=yVCBi{H$o!Emts{wtEUhaHS;;YfNKYhF zP-v3JLnuU>!R}}X3KM7s7e8;?Y-djjwdpAh4^qxy`(N{mAVIz?*HMEv0InFvLC+!9 zB>i4ue}oLJDJj3*8vs{~lTbKUyp$BPJV(z)R(ahU;J7Xttma(t;*@Vj5gwruQor1H z4hf)Eh{|ttWyPj=?jc;K<0s`uya8~GjR@dbL22KjzDs$zKYRli?MYHz?sKY8DEBo~ z;mJ9E-vml~ijKF0>A@8(b!0ZWRXiTNN+!sfL zyecY6{m%YBV5g#|L-&RS+Y5!p%FUSA5 zI7g2Q`7I9n9p%WtK9d)hx>8lzgRmeN_Ir(3qF8Q9cU!JQnK1{}e zN&l4c(yre?)~a8|FN`li0g|k5az$R^zeRynUf$Q_g#4Hk6jaJd`kq7nxU!qqJg#t3 z@N<(Z>X-Z#WT-9K|1lwdUNLJ3VlueOeoNpJWXS&I5)f3%FLU5jmy)Ejke9l7fw+9A zn3*rFAo5a9!o*A8l^D^Ur6#vi4AfV^`tg(FCifNECMMH=o(?9YPaTC${bsGnuRd7Y z;0@eVNbxlCoU|7DV2M2c?08Axe%g+g;+zUtA)fcaqvbhdE%f1}mFJ5cFJtoDu;bI1 zJP+)6dEtKAj!!S_-*)^qCii7KKBEwqYR6|XxsTfM3MThQJ6>6ctF+^@nB33ocvT@@ z)Q-=_zO&m3@w^XjQRTj3E%f2(MD7=Md|n}r$&Sx2Jh#~K1x&76J6?=ev*Qb`EYF+k zUFt>vC{{-9G=7tf+nc;r6{~jWeHXZA5`Uoml_D6O^?eu+54+hPZUEH#Wn5%uHY%!=~o>t?L6s%)A?tO-;&B-1YQZhIxpr?;xF_1H?QBnb!q2< z3;tUd{9_kG+$R7_Pi_GaqJuaDe61t_lBrX zaaWZ1w<%EixI}(SU#BV6^DARBe3OscT`u@4;EIs764j;tBQAK{1s`z154qq!b-{-@ zK7&zE2_^mw5A*`ZZ$1Zq<?zSA^m;@KCX>NFEfPl* zbo0XxH9pwd1YMRA9(2vLO>J8?G`4A5Hg4S3vR&KWxS_3uy2}HZL#Z@AdgJwqGmbhC zkb%t<#B4@V+cA2JVg^DN&GGxZ4i# zux&deCf6Kj`kwAAc0_eMi!FT>k>Ji6wkUT^3#SrV7e4cf?+}cfrglLGkV=F z%!AeKkY#pgK51I5@$tpVYneI!VyZQ~)Dm;TgVPb%o=zp}MR2=_YcERE08)6n9nm)L z)3!!B5pEDkHpPOeR3ybHF5X_tjHh>CW|X`gq$x+Fz8$3Ke>-A^;@dG{en{BQeVhMp MfTJ3Z>9=G51-L#zk^lez literal 0 HcmV?d00001 diff --git a/6.process_and_signal/file_communication.c b/6.process_and_signal/file_communication.c index 3ab6823..2a1265f 100644 --- a/6.process_and_signal/file_communication.c +++ b/6.process_and_signal/file_communication.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -9,6 +8,9 @@ #include #include #include +#include +#include + void sigusr1action (int signal){ @@ -16,16 +18,64 @@ void sigusr1action (int signal){ } -void sigchldaction (int signal){ - - fprintf(stdout,"Parent:Ricevuto SIGCHLD\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) @@ -33,39 +83,70 @@ int main (int index, char** in_data){ if (duplicate == 0){ //child - int numero; - fscanf(stdin,"%d",&numero); - kill (getppid(),SIGUSR1); + + + 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; - - 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()); + 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/da_vedere b/da_vedere index c40d1d3..fdbb81f 100644 --- a/da_vedere +++ b/da_vedere @@ -10,4 +10,4 @@ FLAG2 = -o clear: rm -f -- per esempio -vedi union, esercizi stringa, file, little e bigendian, dati esadecimali. +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