Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //have bug, zombie processes remain, did not want to fix
- //link https://yadi.sk/d/dd5ZH_45EJ217w
- #include <stdio.h>
- #include <string.h>
- #include <signal.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- pid_t pids[100];
- int i = 0;
- int n = 0;
- pid_t pid_target;
- int commander(char *command, pid_t *pid){
- char *lec;
- lec = strtok(command, " \n");
- if(!lec) return -1;
- if(!strcmp(lec, "k")){
- lec = strtok(NULL, " \n");
- if(!lec) return -1;
- *pid = atoi(lec);
- if(*pid <= 0) return -1;
- return 1;
- }
- if(!strcmp(lec, "p")) return 2;
- if(!strcmp(lec, "x")) return 3;
- return -1;
- }
- void printPid(int c){
- int k;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- for(k = 0; k < n; k++)
- kill(pids[k], SIGUSR1);
- }
- void killAll(int c){
- int k, ws;
- printf("Процесс PID %d был убит\n", getpid());
- for(k = 0; k < n; k++){
- kill(pids[k], SIGALRM);
- wait(&ws);
- }
- exit(0);
- }
- int main(int argc, char *argv[]){
- int successor = 0;
- int len;
- int ws;
- char command[64];
- if(argc!=2){
- printf("Введите только одно число (от 0 до 6)\n");
- exit(1);
- }
- successor = atoi(argv[1]);
- if(successor < 0){
- printf("Число меньше 0\n");
- exit(1);
- }
- signal(SIGUSR1, printPid);
- signal(SIGALRM, killAll);
- printf("Главный процесс: PID: %d\n", getpid());
- int k1;
- int i1;
- if (successor>0)
- for (k1=0; k1<2;k1++){
- pids[n++]=fork();
- if (pids[n-1]==0){
- n=0;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- if (successor>1)
- for (i1=0; i1<3;i1++){
- pids[n++]=fork();
- if (pids[n-1]==0){
- n=0;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- if (successor>2)
- for (i1=0; i1<4;i1++){
- pids[n++]=fork();
- if (pids[n-1]==0){
- n=0;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- if (successor>3)
- for (i1=0; i1<5;i1++){
- pids[n++]=fork();
- if (pids[n-1]==0){
- n=0;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- if (successor>4)
- for (i1=0; i1<6;i1++){
- pids[n++]=fork();
- if (pids[n-1]==0){
- n=0;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- if (successor>5)
- for (i1=0; i1<7;i1++){
- pids[n++]=fork();
- if (pids[n-1]==0){
- n=0;
- printf("Процесс PID %d PPID %d \n", getpid(), getppid());
- break;
- }
- }
- break;
- }
- }
- break;
- }
- }
- break;
- }
- }
- break;
- }
- }
- for(;;sleep(1));
- break;
- }
- }
- sleep(1);
- while(1){
- printf("\nВведите команду ");
- fflush(stdout);
- len = read(STDIN_FILENO, command, 64);
- command[len] = 0;
- switch(commander(command, &pid_target)){
- case 1:
- if(kill(pid_target, SIGALRM) < 0){
- printf("Ошибка отправки сигнала\n");
- }
- sleep(1);
- break;
- case 2:
- printf("Главный Процесс (pid: %d)\n", getpid());
- for(i = 0; i < n; i++) kill(pids[i], SIGUSR1);
- sleep(1);
- break;
- case 3:
- printf("Программа завершена!\n");
- for(i = 0; i < n; i++){
- kill(pids[i], SIGALRM);
- wait(&ws);
- }
- sleep(1);
- return 0;
- default: printf("Неккоректная команда\n");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement