Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ncurses.h>
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <string.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/types.h>
- void printString();
- void make_string(int num);
- void quit(int sig);
- void chgFlag(int);
- struct sigaction sa,sa1;
- int num = 0;
- //int flags[100];
- char string[100][200];
- int flag = 1, killflag=0;
- int parentPid;
- void bindSignals()
- {
- sa.sa_handler = quit;
- sigaction(SIGUSR1,&sa,NULL);
- sa1.sa_handler = chgFlag;
- sigaction(SIGUSR2,&sa1,NULL);
- }
- int main()
- {
- initscr();
- refresh();
- bindSignals();
- int pid[100],
- tpid;
- char s;
- int currentProcessIndex = 0;
- char string[200] = "";
- int pos; // extract pos changing to separate func ?
- parentPid = getpid();
- while(1)
- {
- fflush(stdin);
- s = getchar();
- switch(s)
- {
- case 'q':
- clear();
- endwin();
- for(int i = 0; i < num; i++ )
- {
- kill(pid[i], SIGTERM); // ?
- }
- exit(0);
- break;
- case '+':
- num++;
- tpid = fork();
- switch(tpid)
- {
- case 0:
- flag = 0;
- pos = getpid();
- make_string(num);
- pos -= parentPid; // position in list ?
- if(pos > num){
- pos = num;
- }
- while(!killflag)
- {
- if(flag)
- {
- printString();
- flag = 0;
- kill(getppid(), SIGUSR2); // send sigusr2 to parent ?
- }
- }
- exit(0);
- break;
- case -1:
- printw("Error!\n");
- break;
- default:
- // Parent process
- pid[num-1] = tpid;
- break;
- }
- break;
- case '-':
- if( num )
- {
- kill(pid[num-1], SIGUSR1);
- num--;
- }
- break;
- }
- if(currentProcessIndex >= num)
- {
- currentProcessIndex = 0;
- }
- if(flag)
- {
- usleep(100000);
- kill(pid[currentProcessIndex], SIGUSR2);
- flag = 0;
- }
- if( !num )
- {
- flag = 1;
- }
- currentProcessIndex++;
- //refresh();
- }
- clear();
- endwin();
- return 0;
- }
- void printString()
- {
- int pos = getpid();
- char c = 13;
- pos -= parentPid;
- if(pos > num){
- pos = num;
- }
- // clear();
- //move(pos,0);
- //printw(" %d ", pos);
- for(int i = 0; i < strlen(string[pos]); i++)
- {
- //move(pos, i+1);
- printw("%c", string[pos][i]);
- refresh();
- usleep(100000);
- }
- }
- void make_string(int num)
- {
- // int i;
- // time_t t[1];
- // char* cur_time;
- // char buf[200]="";
- // char timee[10]="";
- int pos=getpid()-parentPid;
- int m=getpid();
- if(pos>num)
- pos=num;
- // for(i=0;i<200;i++)
- // string[pos][i]='\x0';
- // strcat(buf, " - at: ");
- // time(t);
- // cur_time = ctime(t);
- // for(i=0;i<8;i++)
- // timee[i]=cur_time[i+11];
- // strcat(buf,timee);
- // strcpy(string[num],buf);
- // for(i=0;i<200;i++)
- // buf[i]='\x0';
- char c = '0' + num;
- for (int i = 0; i < 10; ++i)
- {
- string[pos][i] = c;
- }
- }
- void quit(int sig)
- {
- killflag = 1;
- }
- void chgFlag(int a)
- {
- flag = 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement