kill() 在 C 中的用法混淆
kill() usage confusion in C
看过kill的手册,知道是发送信号的系统调用。我写了一个简单的多进程代码,每个子进程如果捕获到指定的信号,就会执行处理函数,在我的代码中是SIGUSR1。
在我的代码中,我创建了 3 个进程,如果每个进程捕获到 SIGUSR1 信号,每个进程都会打印出 "yo",但输出只打印一两次..?这真的让我很困惑,谢谢你的帮助!
这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#define N 3
int pid_id[N];
void handler (int signum)
{
printf("yo\n");
}
void child(int process_index)
{
struct sigaction sa;
/* Register */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sigaction(SIGUSR1, &sa, NULL);
printf("I am %d.\n", getpid());
pid_id[process_index] = getpid();
sleep(5);
exit(0);
}
int main()
{
int i, status;
pid_t pid[N];
pid_t pid_wait;
for (i=0;i<N;i++)
{
pid[i] = fork();
if (pid[i]==0)
{
child(i);
}
}
for (i=0;i<N;i++)
kill(pid_id[i], SIGUSR1);
for (i=0;i<N;i++)
{
do
{
pid_wait = waitpid(pid[i], &status, WNOHANG);
}while(pid_wait != pid[i]);
}
printf("all done\n");
return 0;
}
请记住,您现在正在处理多个进程。仅仅因为在代码中它看起来像 运行 child
在 kill
之前并不意味着它是按那个顺序发生的。执行顺序完全取决于 OS 如何为这些进程安排 CPU 时间。
发生的情况是一些子进程在安装信号处理程序之前被终止。这是竞争条件的一个例子,很像你在启动新线程时得到的那种。
这可以通过将父项与其子项同步来解决,这样直到所有子项都通知他们已完成必要的初始化步骤后,它才会继续。
看过kill的手册,知道是发送信号的系统调用。我写了一个简单的多进程代码,每个子进程如果捕获到指定的信号,就会执行处理函数,在我的代码中是SIGUSR1。
在我的代码中,我创建了 3 个进程,如果每个进程捕获到 SIGUSR1 信号,每个进程都会打印出 "yo",但输出只打印一两次..?这真的让我很困惑,谢谢你的帮助!
这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#define N 3
int pid_id[N];
void handler (int signum)
{
printf("yo\n");
}
void child(int process_index)
{
struct sigaction sa;
/* Register */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sigaction(SIGUSR1, &sa, NULL);
printf("I am %d.\n", getpid());
pid_id[process_index] = getpid();
sleep(5);
exit(0);
}
int main()
{
int i, status;
pid_t pid[N];
pid_t pid_wait;
for (i=0;i<N;i++)
{
pid[i] = fork();
if (pid[i]==0)
{
child(i);
}
}
for (i=0;i<N;i++)
kill(pid_id[i], SIGUSR1);
for (i=0;i<N;i++)
{
do
{
pid_wait = waitpid(pid[i], &status, WNOHANG);
}while(pid_wait != pid[i]);
}
printf("all done\n");
return 0;
}
请记住,您现在正在处理多个进程。仅仅因为在代码中它看起来像 运行 child
在 kill
之前并不意味着它是按那个顺序发生的。执行顺序完全取决于 OS 如何为这些进程安排 CPU 时间。
发生的情况是一些子进程在安装信号处理程序之前被终止。这是竞争条件的一个例子,很像你在启动新线程时得到的那种。
这可以通过将父项与其子项同步来解决,这样直到所有子项都通知他们已完成必要的初始化步骤后,它才会继续。