Guest User

Untitled

a guest
Jul 19th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/fcntl.h>
  5. #include <sys/ipc.h>
  6. #include <sys/types.h>
  7. #include <sys/sem.h>
  8.  
  9. int main(int argc,char* argv[]){
  10.  
  11. int fin,fout,len,paidia,i,start,end,j,ffinal;
  12. int sema_read,sema_write,finalsize,initsize;
  13. struct sembuf sem_op;
  14. char chh;
  15.  
  16. fin=open(argv[1],O_RDONLY);
  17. fout=open("ask.c.tmp",O_RDWR|O_CREAT|O_TRUNC,0777);
  18. ffinal=open("ask_bare.c",O_RDWR|O_CREAT|O_TRUNC,0777);
  19. len=lseek(fin,0,SEEK_END); //paei sto telos tou arxeiou
  20.  
  21.  
  22. paidia=len/50 + 1;//ta pidia tha einai to synoliko megethos tou arxeiou dia 50 +1
  23. sema_read=semget(IPC_PRIVATE,1,0600); //dimiourgia simaforou pou diabazei
  24. sema_write=semget(IPC_PRIVATE,1,0600);//dimiourgia simaforou pou grafei
  25.  
  26. printf("%d %d %d chars\n",fin,len,paidia);
  27. for (i=0;i<paidia;i++)
  28. {
  29. if (fork()==0)
  30. {
  31. int katastasi=3; // 3 -> kodikas, 1 -> /* */, 2 -> //
  32.  
  33. start= i*50;//xekinaei me tous protous 50 xaraktires
  34. end = start+50;//telos
  35.  
  36. //elenxos gia to telefteo paidi
  37. if (end>len)
  38. end=len;
  39.  
  40. for(j=start;j<end;j++)
  41. {
  42. char c[3];
  43. c[2]=0;
  44.  
  45. sem_op.sem_num=0;//desmeusi semaforou semaread
  46. sem_op.sem_op =-1;
  47. sem_op.sem_flg=0;
  48. semop(sema_read,&sem_op,1);
  49.  
  50. lseek(fin,j,SEEK_SET);//paei sto arxeio eisodou kai paei to dromea sti thesi pou leei to j
  51. read(fin,c,2);//diabazei 2 xaraktires
  52.  
  53. sem_op.sem_num=0; //apodesmeusi semaforou semaread
  54. sem_op.sem_op =1;
  55. sem_op.sem_flg=0;
  56. semop(sema_read,&sem_op,1);
  57.  
  58. if (katastasi==3)
  59. { //kodikas
  60. if (strcmp(c,"/*")==0)//ean c="/*" tote paei stin katastasi 1
  61. katastasi=1;
  62. else if (strcmp(c,"//")==0)
  63. katastasi=2;
  64. }
  65. else if (katastasi==2)
  66. { //sxolio //
  67. if (c[0]=='\n')//xaraktiras telos tou sxoliou einai to /n
  68. katastasi=3;
  69. }
  70. else if (katastasi==1)
  71. { //sxolio /*
  72. if (strcmp(c,"*/")==0)
  73. katastasi=4;
  74. }
  75. else if (katastasi==4)//katastasi 4 kai 5 gia epipleon kathisterisi
  76. katastasi=5;
  77. else if (katastasi==5)
  78. katastasi=3;
  79.  
  80. if (katastasi!=3)
  81. c[0]='@';//antikathista to xaraktira me papaki otan eprokeito gia sxolio
  82. sem_op.sem_num=0; //desmeusi semaforou semawrite
  83. sem_op.sem_op =-1;
  84. sem_op.sem_flg=0;
  85. semop(sema_write,&sem_op,1);
  86.  
  87. lseek(fout,j,SEEK_SET);//kanei seek gia na grapsei to gramma stin exodo
  88. write(fout,c,1);//grafei enan xaraktira
  89.  
  90. sem_op.sem_num=0;//apodesmeusi semaforou semawrite
  91. sem_op.sem_op =1;
  92. sem_op.sem_flg=0;
  93. semop(sema_write,&sem_op,1);
  94. }
  95. //kleisimo arxeion
  96. close(fin);
  97. close(fout);
  98. close(ffinal);
  99. //kleisimo simaforon
  100. semctl(sema_read,0,IPC_RMID,0);
  101. semctl(sema_write,0,IPC_RMID,0);
  102. //telos ektelesis paidion
  103. exit(0);
  104. }
  105. }
  106.  
  107. //anamoni olon ton paidion
  108. for (i=0;i<paidia;i++)
  109. {
  110. wait(0);
  111. }
  112.  
  113. lseek(fout,0,SEEK_SET);//stin arxi
  114.  
  115. //antigrafi olon ton xaraktiron pou den einai @ sto teliko arxeio
  116. while(read(fout,&chh,1)==1)
  117. {
  118. if (chh!='@')
  119. write(ffinal,&chh,1);
  120. }
  121.  
  122.  
  123. //emfanisi tou posostou simbiesis
  124. finalsize=lseek(ffinal,0,SEEK_END);
  125. initsize=lseek(fin,0,SEEK_END);
  126.  
  127. printf("Simbiesi %d\n",(finalsize-initsize)*initsize);
  128.  
  129. //kleisimo arxeion
  130. close(fin);
  131. close(fout);
  132. close(ffinal);
  133.  
  134. semctl(sema_read,0,IPC_RMID,0);
  135. semctl(sema_write,0,IPC_RMID,0);
  136. //telos patera
  137.  
  138. }
Add Comment
Please, Sign In to add comment