kill()函数在C语言中不起作用

时间:2018-09-07 09:18:39

标签: c linux pipe fork

我有以下代码。它生成n个孩子,然后生成一个介于0和n之间的随机数。因此让该随机数假设为“ i”。我必须杀死孩子的孩子。

问题在于,由于后和之前的ptree完全相同,因此kill函数不会杀死任何东西。

我找不到解决方案,只有他的所有兄弟都被他杀了,输出才是父亲和孩子。

#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 :(得分:1)

由于主进程从未呼叫过其他孩子的waitpid,所以所有其他孩子在被杀之后都变成了僵尸。

更新:您还应该在其他子进程进入睡眠状态之前关闭它们的管道结束描述符,否则杀手级子进程将被困在等待来自管道的更多数据。

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

更新:sleep花费unsigned int秒,因此sleep(0.5)相当于sleep(0)

答案 1 :(得分:0)

尝试使用sleep(1)

sleep()函数需要一个整数参数,因此sleep(0.5)等于零-这可能不足以使演示正常工作。子进程可能会在终止信号到达之前终止。