gpt4 book ai didi

c - 系统调用kill将子进程转换为僵尸进程

转载 作者:行者123 更新时间:2023-11-30 16:25:07 27 4
gpt4 key购买 nike

我编写了一段代码,用 fork() 创建一个子进程。该子级的父级应向其子级发送 SIGUSR1/2,并且子级应使用 SIGUSR2/1 进行应答。

这是代码:

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

void HDL_PSIGUSR(int sig) {
printf("Signal 0x%x received.\n\n", sig);
fflush(stdout);
}

void HDL_SSIGUSR(int sig) {
if (sig == SIGUSR1) {
printf("PID %d -> PID %d: 0x%x\n", getpid(), getppid(), SIGUSR2);
kill(getppid(), SIGUSR2);
} else if (sig == SIGUSR2) {
printf("PID %d -> PID %d: 0x%x\n", getpid(), getppid(), SIGUSR1);
kill(getppid(), SIGUSR1);
}

fflush(stdout);
}

void HDL_SSIGINT(int sig) {
kill(getppid(), SIGINT);
}

void son() {

signal(SIGUSR1, HDL_SSIGUSR);
signal(SIGUSR2, HDL_SSIGUSR);
signal(SIGINT, HDL_SSIGINT);
signal(SIGALRM, SIG_IGN);
signal(SIGCHLD, SIG_IGN);

while (true) {
pause();
}

}

int main() {
int* _buf, n, i, t, timer = 0;
pid_t pid;
char buff[1000];

printf("Number of signals to send: ");
scanf("%d", &n);

printf("Interval time: ");
scanf("%d", &t);

printf("Signals to send: ");

_buf = malloc(n * sizeof *_buf);
for (i = 0; i < n; i++) {
scanf("%d", &_buf[i]);
}

fflush(stdout);

if (pid = fork()) {

signal(SIGUSR1, HDL_PSIGUSR);
signal(SIGUSR2, HDL_PSIGUSR);

i = 0;
while (true) {
i %= n;
//sprintf(buff, "kill -USR1 %d", pid);
//system(buff);
kill(pid, SIGUSR1);
sleep(t);
}

} else {
son();
exit(0);
}

waitpid(pid, (int*)0, 0);
return 0;
}

问题是,如果我使用kill()系统调用,子进程就会变成僵尸进程。相反,如果我使用 system() 系统调用并从那里调用命令kill on CHILD PID,它就会起作用!为什么?

最佳答案

谢谢大家!这个问题正如 @Jonathan Leffler 和 @Shawn 所说。可以通过sleep(1)来解决;在开始发送信号之前在父进程中。我修改了我的代码,如下所示:

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

bool startProg = false;

void HDL_PSIGUSR(int sig) {

if (!startProg) {
startProg = true;
return;
}

printf("Received signal 0x%x\n", sig);
fflush(stdout);
}

void HDL_SSIGUSR(int sig) {
kill(getppid(), (sig == SIGUSR1) ? SIGUSR2 : SIGUSR1);
}

void HDL_SSIGINT(int sig) {
kill(getppid(), SIGINT);
}

void son() {

signal(SIGUSR1, HDL_SSIGUSR);
signal(SIGUSR2, HDL_SSIGUSR);
signal(SIGINT, HDL_SSIGINT);
signal(SIGALRM, SIG_IGN);
signal(SIGCHLD, SIG_IGN);

kill(getppid(), SIGUSR1);

while (true) {
pause();
}

}

int main() {
int* _buf, n, i, t;
pid_t pid;

printf("Number of signals to send: ");
scanf("%d", &n);

printf("Interval time: ");
scanf("%d", &t);

printf("Signals to send: ");

_buf = malloc(n * sizeof *_buf);
for (i = 0; i < n; i++) {
scanf("%d", &_buf[i]);
}

fflush(stdout);

if (pid = fork()) {

signal(SIGUSR1, HDL_PSIGUSR);
signal(SIGUSR2, HDL_PSIGUSR);

while (!startProg) {
pause();
}

i = 0;
while (true) {
i %= n;

kill(pid, _buf[i++]);
pause();
sleep(t);
}

} else {
son();
exit(0);
}

waitpid(pid, (int*)0, 0);
return 0;
}

关于c - 系统调用kill将子进程转换为僵尸进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53505004/

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