我在c中使用fork()构建了一个由十个进程组成的树。我的任务是,我必须选择一个随机的儿童进程,谁将杀死他的兄弟。所以我的想法是,父母会通过pipefile-descriptor将他兄弟的pids发送给杀手,然后使用kill()函数。但我不知道为什么这个函数不能正常工作。杀手进程是否需要任何类型的权限来杀死其他进程,或者我做错了什么?
我的代码:(./pregunta1 10

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

int main(int nargv,char *argv[]){
    int n,i,numRand,status,stdout_copy;
    pid_t child,padre,*child_pids,selecto, auxPid;
    char cadena[100];
    int fd[2];

    n = atoi(argv[1]);
    child_pids = (pid_t*)malloc(n*sizeof(pid_t));
    pipe(fd);

    srand(time(NULL));
    numRand = rand()%n;

    padre = getpid();

    for (i = 0; i < n; ++i){
        child = fork();
        child_pids[i] = child;

        if((i == numRand)&&(child==0)){ //killer process
            selecto = getpid();
            printf("The killer process will be (PID):  %d\n\n",selecto);
            dup2(fd[0],STDIN_FILENO);
            close(fd[0]);
            close(fd[1]);
            sleep(1);
            //Kill his brothers
            for(i=0;i<(n-1);i++){
                read(STDIN_FILENO, &auxPid, sizeof(auxPid));
                kill(auxPid, SIGKILL);
                printf("The process %d killed: %d\n",getpid(),auxPid);

            }
            break;
            sleep(3);
        }


        if(child==0){  //childs
            close(fd[0]);
            close(fd[1]);
            sleep(10);
            break;
        }
    }

    if(getpid() == padre){   //parent process
        //using pstree first time
        sprintf(cadena,"pstree -p %d\n",getpid());
        system(cadena);
        //making a conexion with the parent process and the killer
        stdout_copy = dup(1);
        dup2(fd[1],STDOUT_FILENO);
        close(fd[0]);
        close(fd[1]);
        //Sending PIDs to the killer process
        for(i = 0;i<n;i++){
            if(i != numRand){
                auxPid = child_pids[i];
                write(STDOUT_FILENO,&auxPid,sizeof(auxPid));
            }
        }

        sleep(2);
        //using pstree first time
        dup2(stdout_copy, 1);
        system(cadena);
        wait(&status);

    }
    return 0;
}

我的输出(错误):
杀手进程将是(PID):5162
普瑞甘塔1(5154)———普瑞甘塔1(5155)
——预孕1(5156)
——普瑞坎塔1(5157)
——普瑞贡塔1(5158)
——预孕1(5159)
——预孕1(5160)
——预孕1(5161)
——普瑞坎塔1(5162)
——预孕1(5163)
——普瑞坎塔1(5164)
——SH(5165)——PStree(5166)
过程5162死亡:5155
过程5162死亡:5156
过程5162死亡:5157
过程5162死亡:5158
过程5162死亡:5159
过程5162死亡:5160
过程5162死亡:5161
过程5162死亡:5163
过程5162被杀死:5164
普瑞甘塔1(5154)———普瑞甘塔1(5155)
——预孕1(5156)
——普瑞坎塔1(5157)
——普瑞贡塔1(5158)
——预孕1(5159)
——预孕1(5160)
——预孕1(5161)
——普瑞坎塔1(5162)
——预孕1(5163)
——普瑞坎塔1(5164)
—SH(5167)—PStree(5168)
预期产量:
杀手进程将是(PID):5162
普瑞甘塔1(5154)———普瑞甘塔1(5155)
——预孕1(5156)
——普瑞坎塔1(5157)
——普瑞贡塔1(5158)
——预孕1(5159)
——预孕1(5160)
——预孕1(5161)
——普瑞坎塔1(5162)
——预孕1(5163)
——普瑞坎塔1(5164)
——SH(5165)——PStree(5166)
过程5162死亡:5155
过程5162死亡:5156
过程5162死亡:5157
过程5162死亡:5158
过程5162死亡:5159
过程5162死亡:5160
过程5162死亡:5161
过程5162死亡:5163
过程5162被杀死:5164
普瑞甘塔1(5154)———普瑞甘塔1(5162)
—SH(5167)—PStree(5168)

最佳答案

看起来被杀死的子进程处于僵尸状态。你必须为他们所有人(而不仅仅是一个)打电话wait()。在调用pstree之前执行此操作。看看这里:Make parent wait for all child processes
在你的代码中而不是

system(cadena);
wait(&status);

你应该有
for (int i = 0; i < n; i++)
    wait(&status);
system(cadena);

关于c - 使用kill()函数杀死同一个父进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45909449/

10-10 07:19