gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:15 24 4
gpt4 key购买 nike

我有以下代码。它生成 n 个子节点,然后生成一个介于 0 和 n 之间的随机数。所以这个随机数让我们假设是“i”。子号我一定要杀了他的兄弟。

问题是 kill 函数没有杀死任何东西,因为之前和之后的 ptree 完全相同。

我找不到解决方案,输出必须是父亲和第 i 个 child ,因为他的所有兄弟都被他杀死了。

#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;
}

最佳答案

由于主进程从不为其他子进程调用waitpid,所有子进程在被杀死后都变成僵尸。

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

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

更新:sleep 占用 unsigned int 秒数,因此 sleep(0.5) 将等同于 sleep(0)

关于c - kill() 函数在 C 语言中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52219346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com