Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.97 KB | None | 0 0
  1. #include <ncurses.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include <signal.h>
  8. #include <string.h>
  9. #include <sys/ipc.h>
  10. #include <sys/sem.h>
  11. #include <sys/types.h>
  12.  
  13. void printString();
  14. void make_string(int num);
  15. void quit(int sig);
  16. void chgFlag(int);
  17.  
  18. struct sigaction sa,sa1;
  19.    
  20. int num = 0;
  21. //int flags[100];
  22. char string[100][200];
  23. int flag = 1, killflag=0;
  24.  
  25. int parentPid;
  26.  
  27. void bindSignals()
  28. {
  29.     sa.sa_handler = quit;
  30.     sigaction(SIGUSR1,&sa,NULL);
  31.  
  32.     sa1.sa_handler = chgFlag;
  33.     sigaction(SIGUSR2,&sa1,NULL);
  34.  
  35. }
  36.  
  37. int main()
  38. {
  39.     initscr();
  40.     refresh();
  41.     bindSignals();
  42.  
  43.     int pid[100],
  44.         tpid;
  45.     char s;
  46.     int currentProcessIndex = 0;
  47.     char string[200] = "";
  48.     int pos; // extract pos changing to separate func ?
  49.  
  50.     parentPid = getpid();
  51.     while(1)
  52.     {
  53.         fflush(stdin);
  54.         s = getchar();
  55.        
  56.         switch(s)
  57.         {
  58.         case 'q':
  59.             clear();
  60.             endwin();
  61.  
  62.             for(int i = 0; i < num; i++ )
  63.             {
  64.                 kill(pid[i], SIGTERM); // ?
  65.             }
  66.  
  67.             exit(0);
  68.             break;
  69.  
  70.         case '+':
  71.             num++;
  72.             tpid = fork();
  73.            
  74.             switch(tpid)
  75.             {
  76.             case 0:
  77.                 flag = 0;
  78.                 pos = getpid();
  79.                 make_string(num);
  80.                
  81.                 pos -= parentPid; // position in list ?
  82.                 if(pos > num){
  83.                     pos = num;                                    
  84.                 }
  85.                
  86.                 while(!killflag)
  87.                 {  
  88.                     if(flag)
  89.                     {                  
  90.                         printString();
  91.                         flag = 0;
  92.                         kill(getppid(), SIGUSR2); // send sigusr2 to parent ?
  93.                     }
  94.                 }  
  95.                 exit(0);
  96.            
  97.                 break;
  98.            
  99.             case -1:
  100.                 printw("Error!\n");
  101.                 break;
  102.            
  103.             default:
  104.             // Parent process
  105.                 pid[num-1] = tpid;
  106.                 break;         
  107.             }      
  108.            
  109.             break;
  110.         case '-':
  111.             if( num )
  112.             {
  113.                 kill(pid[num-1], SIGUSR1);
  114.                 num--;
  115.             }
  116.             break;
  117.         }
  118.        
  119.         if(currentProcessIndex >= num)
  120.         {
  121.           currentProcessIndex = 0; 
  122.         }
  123.        
  124.         if(flag)
  125.         {
  126.             usleep(100000);
  127.             kill(pid[currentProcessIndex], SIGUSR2);
  128.             flag = 0;
  129.         }
  130.         if( !num )
  131.         {
  132.             flag = 1;
  133.         }
  134.        
  135.         currentProcessIndex++;
  136.         //refresh();
  137.     }
  138.     clear();
  139.     endwin();
  140.  
  141.     return 0;
  142. }
  143.  
  144. void printString()
  145. {
  146.    
  147.     int pos = getpid();
  148.     char c = 13;
  149.  
  150.     pos -= parentPid;
  151.     if(pos > num){
  152.         pos = num;
  153.     }
  154.        
  155.     // clear();
  156.    
  157.     //move(pos,0);
  158.     //printw(" %d ", pos);
  159.    
  160.     for(int i = 0; i < strlen(string[pos]); i++)
  161.     {
  162.         //move(pos, i+1);
  163.         printw("%c", string[pos][i]);
  164.         refresh();
  165.         usleep(100000);
  166.     }      
  167. }
  168.  
  169. void make_string(int num)
  170. {
  171.    
  172.     // int i;
  173.     // time_t t[1];
  174.     // char* cur_time;
  175.     // char buf[200]="";
  176.     // char  timee[10]="";
  177.     int pos=getpid()-parentPid;
  178.     int m=getpid();
  179.  
  180.     if(pos>num)
  181.         pos=num;
  182.    
  183.     // for(i=0;i<200;i++)
  184.     //  string[pos][i]='\x0';
  185.    
  186.     // strcat(buf, " - at: ");
  187.     // time(t);
  188.     // cur_time = ctime(t);
  189.     // for(i=0;i<8;i++)
  190.     //  timee[i]=cur_time[i+11];
  191.     // strcat(buf,timee);
  192.     // strcpy(string[num],buf);
  193.  
  194.     // for(i=0;i<200;i++)
  195.     //  buf[i]='\x0';
  196.     char c =  '0' + num;
  197.     for (int i = 0; i < 10; ++i)
  198.     {
  199.         string[pos][i] = c;
  200.     }
  201. }
  202.  
  203. void quit(int sig)
  204. {
  205.     killflag = 1;
  206. }
  207.  
  208. void chgFlag(int a)
  209. {
  210.     flag = 1;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement