2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Linux父进程如何发信号给子进程 关于C#:fork和signal:如何将信号从父进程发送到特

Linux父进程如何发信号给子进程 关于C#:fork和signal:如何将信号从父进程发送到特

时间:2021-06-06 06:02:41

相关推荐

Linux父进程如何发信号给子进程 关于C#:fork和signal:如何将信号从父进程发送到特

我需要fork两个子进程。 一个可以接收信号3,打印hello并将信号4发送到另一个子进程; 另一个可以接收信号4,打印world并将信号3发送到第一个子进程。

首先,父进程将在睡眠3秒钟后将信号3发送到第一个子进程。

然后3秒后,父进程将发送SIGKILL杀死他们两个。

我不知道如何向特定的子进程发送信号(我知道我们有一个函数kill来发送信号,但是我不知道在这里使用它)。

这是我的代码:

#include

#include

#include

#include

#include

void func(int n)

{

printf("ping

");

// how to send signal 4 to the second process?

}

void func2(int n)

{

printf("pong

");

// how to send signal 3 to the first process?

}

int main()

{

pid_t pid;

int i;

for(i = 0; i < 2; i++)

{

pid = fork();

if(pid == 0)

{

if(i == 0)

{

signal(3, func);

}

else

{

signal(4, func2);

}

while(1);

}

else

{

if(i == 1)

{

sleep(3);

// how to send signal 3 to the first child process?

sleep(3);

// how to kill the two children?

}

}

}

return 0;

}

在信号上下文中调用printf()的未定义行为。

/linux/man-pages/man2/kill.2.html

@EOF那我该怎么办?

@alk但是我仍然不知道如何向子进程发送信号。

您需要kill()系统调用。 棘手的部分是,您必须以某种方式告诉每个孩子其兄弟姐妹的PID。 父母可能通过在管道上写信息来告诉他们两个吗? 或者,也许您使用过程组来进行信号发送。

@JonathanLeffler是的,实际上这是我不知道该怎么做。 也许您是对的,我必须使用管道或共享内存。

@ user3629249非常感谢。 如果您愿意,您可以回答这个问题,我会接受您的回答。

将我的评论移至答案。

您可以使用popen()函数通过分叉并打开该进程的管道来打开该进程(而不是直接使用fork())

父级知道每个进程的PID,因此可以轻松地将第二个孩子的pid传递给第一个孩子。

第一个孩子可以使用pid和kill()函数将信号传递给第二个孩子。

因此,使用popen()启动第一个孩子。使用fork()启动第二个孩子,然后通过popen()创建的流将pid从第二个孩子传递到第一个孩子。

从fork()调用返回的pid值的处理未正确处理。

发布的代码假设对fork()的调用已成功...这不是一个安全/有效的假设

该代码还需要检查pid是否为-1并适当地处理该错误。

当子进程完成时,它不应使用exit()函数位于while()循环中,而应退出。

父进程不应仅退出,因为这会使两个子进程成为僵尸。 (如果不重新启动系统,僵尸很难摆脱。)

相反,父级应该调用wait()甚至更好的waitpid()(并记住子进程需要实际退出,而不是坐在while()循环中。

1)func()和func2()应该检查参数以确保它是正在处理的正确信号。

2)signal()的手册页指示不应使用它。手册页建议使用:sigaction(),

fork时,您将获得新的pid。根据杀死手册,您使用pid调用kill(pid_t pid, int sig);

如果我在第一个sleep(3)之后写kill(pid, 3),我认为它将发送给所有子进程。 我需要发送到第一个子进程。

@托马斯:不; 除非您为pid使用零或负值,否则它将信号发送到一个进程。

好。 我知道了。 我还有另一个问题:如何在进程之间共享pid? 因为我需要func中的kill(4, secondProcessPid)和func2中的kill(3, firstProcessPid)。 如何获得这两个PID? 我必须使用共享内存之类的东西吗?

您有向后kill的参数。...在这种情况下,共享内存似乎是多余的。 当您fork()时,子进程是父进程的副本。 这包括全局变量和局部变量。

Linux父进程如何发信号给子进程 关于C#:fork和signal:如何将信号从父进程发送到特定的子进程...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。