функция kill () не работает на языке Си - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий код.Он генерирует n потомков, а затем случайное число от 0 до n.Так что случайное число позволяет предположить, что это «я».Дочерний номер, по которому я должен убить его братьев.

Проблема в том, что функция kill ничего не убивает, так как оба ptree после и до этого абсолютно одинаковы.

Я не могу найти решение,выходной должен быть только отец и я, так как все его братья были убиты им.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <math.h>

char archSalidaAntes[] = "aprocesosAntes.txt";
char archSalidaDespues[] = "aprocesosDespues.txt";

void imprimirArreglo(int arr[], int n){

    int i;
    for(i=0; i<n; i++){
        printf("%d\t", arr[i]);
    }
    printf("\n");
}

void imprimirArbolTxt(char nombreArchivo[], pid_t id){
    char buff[255];
    sprintf(buff, "pstree -p -c -l %d  > %s", (int)id, nombreArchivo);
    system(buff);
}

void communicateSon(int arrProc[], int n, int fd[]){
    int i;
    int data;
    int writeResp;

    close(fd[0]); //closing input

    for(i=0; i<n; i++){
        data = arrProc[i];
        writeResp = write(fd[1], &data, sizeof(data));
        if(!writeResp){
            printf("error writing");
        }
    }

    close(fd[1]); //closing output


}

void killOthers(int n, int fd[], int randInt){
    int i;
    int readResp;
    int killResp;
    int data;
    int arrProc[n];

    close(fd[1]); //closing output
    i = 0;
    while(1){   
        readResp = read(fd[0], &data, sizeof(data));
        fflush(stdout);
        fflush(stdin);
        if(!readResp){
            break;
        }
        arrProc[i] = data;
        i++;
    }
    imprimirArreglo(arrProc, n);
    printf("id elegido: %d\n", getpid());


    for(i=0; i<n; i++){
        if(i!= randInt){
            printf("killing: %d\n", arrProc[i]);
            killResp = kill((pid_t)arrProc[i], SIGKILL);            
            if(killResp < 0){
                printf("error kill: %d \n", killResp);
            }
            int aux = kill(arrProc[i], 0);
            printf("aux: %d\n", aux);
        }   
    }

    close(fd[0]); //closing input

    char com[30];
    sprintf(com, "pstree -p %d", getppid());
    system(com);
}

int main(int argc, char **argv){
    int n;
    int i;
    int *arrProc;
    int randInt;
    int fd[2];

    pid_t pId;

    n = atoi(argv[1]);

    printf("n = %d\n", n);
    srand(time(NULL));

    arrProc = (int*) malloc(sizeof(int) * n);

    randInt = rand() % n;

    pipe(fd);

    for(i=0; i<n; i++){
        pId = fork();
        if(pId){
            arrProc[i] = (int)pId;
            if(i == (n-1)){
                char com[30];
                sprintf(com, "pstree -p %d", getppid());
                system(com);
                communicateSon(arrProc, n, fd);
                waitpid(arrProc[randInt], NULL, 0);
                printf("termino la espera del hijo\n");

                free(arrProc);
            }
        } else if(pId == 0){ //hijos
            if(i==randInt){
                killOthers(n, fd, randInt);
                exit(0);
            } else{
                break;
            }


        }

    }
    sleep(0.5);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Поскольку основной процесс никогда не вызывает waitpid для других детей, все они становятся зомби после того, как их убили.

Обновление: вы должны также закрыть дескрипторы концов канала в других дочерних процессах перед тем, как перевести их в спящий режим, иначе дочерний процесс-убийца застрянет в ожидании получения дополнительных данных из канала.

} else{
    close(fd[0]);
    close(fd[1]);
    break;
}

Обновление: sleep занимает unsigned int количество секунд, поэтому sleep(0.5) будет эквивалентно sleep(0).

0 голосов
/ 07 сентября 2018

Попробуйте с sleep(1).

Функция sleep() требует целочисленный аргумент, поэтому sleep(0.5) равен нулю - что, вероятно, недостаточно "достаточно долго" для вашей демонстрации. Дочерние процессы могут завершиться до того, как сигнал уничтожения достигнет их.

...