Advertisement
rnort

SPO-01-NIX

Sep 30th, 2012
370
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.83 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <curses.h>
  4. #include <time.h>
  5. #include <unistd.h>
  6. #include <sys/time.h>
  7. #include <sys/types.h>
  8. #include <sys/wait.h>
  9.  
  10. void drawtime(int x, int y)
  11. {
  12.     // Get current time
  13.     time_t t = time(NULL);
  14.     // Transform to string
  15.     char* s = ctime(&t);
  16.     // Write time to given position of console
  17.     mvaddstr(x,y,s);
  18.     // Refresh output
  19.     refresh();
  20.     sleep(1);
  21. }
  22.  
  23. int kbhit(){
  24.     fd_set rfds;
  25.     struct timeval tv;
  26.            
  27.     /* Ждем, пока на стандартном вводе (fd 0) что-нибудь  появится. */
  28.     FD_ZERO(&rfds);
  29.     FD_SET(0, &rfds);
  30.     tv.tv_sec = 0;
  31.     tv.tv_usec = 100;
  32.  
  33.    return select(1, &rfds, NULL, NULL, &tv);
  34. }
  35.  
  36. void init_curses()
  37. {
  38.     // Initialize all curses data structures
  39.     initscr();
  40.     //Set cursor set to 0 - invisible
  41.     curs_set(0);
  42.     // Disable input echo
  43.     noecho();
  44.     refresh();
  45.  
  46. }
  47.  
  48. int waitForChild(pid_t pid)
  49. {
  50.     int status;
  51.     pid_t w = waitpid(pid, &status, WCONTINUED | WUNTRACED);
  52.     if ( w == -1 )
  53.     {
  54.         return 0;
  55.     }
  56.     if (WIFEXITED(status) || WIFSIGNALED(status)){
  57.         return 1;
  58.     }
  59.     return 1;
  60. }
  61.  
  62. int main(int argc, char** argv)
  63. {
  64.     init_curses();
  65.     // Fork current process
  66.     pid_t childpid = fork();
  67.     int childExist = 1;
  68.    
  69.     if (childpid){ // parent
  70.         while( !kbhit() )
  71.         {
  72.             mvaddstr(0,0,"Parent");
  73.             drawtime(2,0);
  74.         }
  75.         // Parent takes kbhit()
  76.         kill(childpid, SIGTERM); // kill child
  77.         if (!waitForChild(childpid))
  78.             exit(EXIT_FAILURE);
  79.     }
  80.     else{ // child
  81.         while( true )
  82.         {
  83.             mvaddstr(0, 40,"Child");
  84.             drawtime(2 ,40);
  85.         }
  86.     }
  87.     // Exit from curses and restore default settings
  88.     endwin();
  89.     exit(EXIT_SUCCESS);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement