Advertisement
rnort

SPO-2-NIX

Oct 20th, 2012
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.40 KB | None | 0 0
  1. #include <ncurses.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <string.h>
  6. #include <sys/wait.h>
  7.  
  8. #define MAX_PROCESS_NUMBER 100
  9.  
  10. void printString();
  11. void make_string(int num);
  12. void quit(int sig);
  13. void chgFlag(int);
  14.  
  15. struct sigaction  endProcessSignal, printingSignal;
  16. int num = 0;
  17. char string[MAX_PROCESS_NUMBER][200];
  18. int allowPrint = 1, killflag=0;
  19. int parentPid;
  20.  
  21. void bindSignals()
  22. {
  23.     endProcessSignal.sa_handler = quit;
  24.     sigaction(SIGUSR1,&endProcessSignal,NULL);
  25.     printingSignal.sa_handler = chgFlag;
  26.     sigaction(SIGUSR2,&printingSignal,NULL);
  27. }
  28.  
  29. void init()
  30. {
  31.     initscr();
  32.     curs_set(0);
  33.     refresh();
  34.     bindSignals();
  35. }
  36.  
  37. void child()
  38. {
  39.     allowPrint;
  40.     int pos; // extract pos changing to separate func ?
  41.     pos = getpid();
  42.     make_string(num);          
  43.     pos -= parentPid; // position in list ?
  44.     if(pos > num){
  45.         pos = num;                                    
  46.     }    
  47.     while(!killflag)
  48.     {  
  49.         if(allowPrint)
  50.         {              
  51.             printString();
  52.             allowPrint = 0;
  53.             kill(getppid(), SIGUSR2); // send sigusr2 to parent ?
  54.         }
  55.     }
  56. }
  57.  
  58. int waitForChild(pid_t childPid)
  59. {
  60.     pid_t w;
  61.     int status;
  62.     do
  63.     {
  64.         w = waitpid(childPid, &status, WUNTRACED | WCONTINUED);
  65.     }while(!WIFEXITED(status) && !WIFSIGNALED(status));
  66.     return status;
  67. }
  68.  
  69. void onQuit(pid_t* pidArray)
  70. {
  71.     for(int i = 0; i < num; i++ )
  72.     {
  73.         kill(pidArray[i], SIGUSR1);
  74.         waitForChild(pidArray[i]);
  75.     }
  76.     clear();
  77.     endwin();
  78. }
  79.  
  80. int main()
  81. {
  82.     init();
  83.     pid_t childPids[MAX_PROCESS_NUMBER], tpid;
  84.     int currentProcessIndex = 0;
  85.     char s;
  86.     while(1)
  87.     {
  88.         fflush(stdin);
  89.         s = getchar();
  90.        
  91.         switch(s)
  92.         {
  93.         case 'q':
  94.             onQuit(childPids);
  95.             exit(EXIT_SUCCESS);
  96.             break;
  97.  
  98.         case '+':
  99.  
  100.             tpid = fork();
  101.            
  102.             switch(tpid)
  103.             {
  104.             case 0:
  105.                 child();
  106.                 exit(EXIT_SUCCESS);
  107.                 break;
  108.  
  109.             case -1:
  110.                 printw("Error!\n");
  111.                 break;
  112.            
  113.             default:                
  114.                 //  In parent process
  115.                 allowPrint = num ? allowPrint : 1;
  116.                 ++num;
  117.                 childPids[num-1] = tpid;
  118.                 usleep(10); // wait for sigaction binding in child process
  119.                 break;         
  120.             }      
  121.             break;
  122.         case '-':
  123.             if( num )
  124.             {
  125.                 kill(childPids[num-1], SIGUSR1);
  126.                 waitForChild(childPids[num-1]);
  127.                 --num;
  128.             }
  129.             break;
  130.         default:
  131.             break;
  132.         }
  133.        
  134.         if( allowPrint && num)
  135.         {
  136.             currentProcessIndex = currentProcessIndex >= num ? 0 : currentProcessIndex;
  137.             kill(childPids[currentProcessIndex], SIGUSR2);
  138.             allowPrint = 0;
  139.             currentProcessIndex++;    
  140.         }
  141.     }
  142.     clear();
  143.     endwin();
  144.     exit(EXIT_SUCCESS);
  145. }
  146.  
  147. void printString()
  148. {
  149.    
  150.     int pos = getpid();
  151.     char c = 13;
  152.  
  153.     pos -= parentPid;
  154.     if(pos > num){
  155.         pos = num;
  156.     }
  157.        
  158.     for(int i = 0; i < strlen(string[pos]); i++)
  159.     {
  160.         printw("%c", string[pos][i]);
  161.         refresh();
  162.         usleep(100000);
  163.     }      
  164. }
  165.  
  166. void make_string(int num)
  167. {  
  168.     int pos=getpid()-parentPid;
  169.     int m=getpid();
  170.  
  171.     if(pos>num)
  172.         pos=num;
  173.     char c =  '0' + num;
  174.     for (int i = 0; i < 10; ++i)
  175.     {
  176.         string[pos][i] = c;
  177.     }
  178. }
  179.  
  180. void quit(int sig)
  181. {
  182.     killflag = 1;
  183. }
  184.  
  185. void chgFlag(int a)
  186. {
  187.     allowPrint = 1;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement