gpt4 book ai didi

c - fork() 并在 Linux 中杀死

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:28 24 4
gpt4 key购买 nike

在我的项目中,我需要一个子任务与父任务并行执行。我使用 fork() 创建一个并行进程,即 aplay xyz.wav。现在,当我想从父进程中终止子进程时,例如 system("kill -9 aplay ") aplay 被终止了,但我看到了父任务的两个实例。我认为其中一个是通过调用 fork() 制作的副本,另一个是原始文件。每次调用 fork() 时,副本的数量都会增加。我意识到内存溢出。我只想保留原来的流程。我试图杀死那个父进程但失败了!父进程的副本显示为“已失效”。

'defucnt' 进程继续增加,因为我调用并行进程,无论我是否终止 aplay。我也试图通过它的 PID 杀死 defunt,它也没有用。

static int
test(Core *pc, char *args)
{


pid1=fork();
if (pid1 ==0)
{
system ("ps " );
system("aplay /opt/Line_Tone_14s.wav");

_exit(0);
}
else if(pid1<0)
{
out("fork() ERROR (-1) returned\n");
}
else if(pid1>0)
{
out("I AM IN PARENT PROCESS() NOW\n");
}
return 1;

}

static int
test1(Core *pc, char *args)
{
system ("ps " );
system ("killall -9 aplay ");
return 1;

}

    Initially 

> PID TTY TIME CMD
1580 pts/0 00:00:00 sudo
1581 pts/0 00:00:00 su
1589 pts/0 00:00:00 bash
5732 pts/0 00:00:00 parent
5738 pts/0 00:00:00 sh
5739 pts/0 00:00:00 ps

>test
> PID TTY TIME CMD
1580 pts/0 00:00:00 sudo
1581 pts/0 00:00:00 su
1589 pts/0 00:00:00 bash
5732 pts/0 00:00:00 parent
5737 pts/0 00:00:00 parent
5740 pts/0 00:00:00 sh
5741 pts/0 00:00:00 aplay
5743 pts/0 00:00:00 sh
5744 pts/0 00:00:00 ps


>test1
>killed

after kill
>PID TTY TIME CMD
1580 pts/0 00:00:00 sudo
1581 pts/0 00:00:00 su
1589 pts/0 00:00:00 bash
5732 pts/0 00:00:00 parent
5737 pts/0 00:00:00 parent <defunct>
5753 pts/0 00:00:00 sh
5754 pts/0 00:00:00 ps

>test
> PID TTY TIME CMD
1580 pts/0 00:00:00 sudo
1581 pts/0 00:00:00 su
1589 pts/0 00:00:00 bash
5732 pts/0 00:00:00 parent
5737 pts/0 00:00:00 parent <defunct>
5759 pts/0 00:00:00 parent
5762 pts/0 00:00:00 sh
5763 pts/0 00:00:00 aplay
5765 pts/0 00:00:00 sh
5766 pts/0 00:00:00 ps

>test1
>killed

after kill

>PID TTY TIME CMD
1580 pts/0 00:00:00 sudo
1581 pts/0 00:00:00 su
1589 pts/0 00:00:00 bash
5732 pts/0 00:00:00 parent
5737 pts/0 00:00:00 parent <defunct>
5759 pts/0 00:00:00 parent <defunct>
5773 pts/0 00:00:00 sh
5774 pts/0 00:00:00 ps

我也在 test() 命令中尝试过这个

else if(pid1>0)
{
out("I AM IN PARENT PROCESS() NOW\n");
wait(&status);
}

通过这样做,无论我调用“测试”命令多少次,在 aplay 完成播放声音后,只剩下一个父进程。但问题是,在声音播放期间我不能输入任何其他命令,直到它结束。所以无法在播放声音之间杀死它。

我想并行播放声音,想随时杀掉。

最佳答案

不要那样杀了它!您在 pid1 中有子 PID,只需使用 kill() 函数将其杀死。

生成一个单独的进程来运行 killall 是不必要的、昂贵的并且(正如您已经发现的)不那么可靠。如果该可执行文件有 5 个副本在运行怎么办?

你可以使用类似的东西:

#include <sys/types.h>
#include <signal.h>
:
int rc = kill (pid1, 9); // or SIGKILL for portability, rather than 9.
// Check rc and errno.

在你的 parent 身上。

我也会认真考虑删除子进程中的 system 调用,因为它们会启动单独的进程。您可以通过使用 exec 系列调用替换子进程空间中的程序来做得更好。

关于c - fork() 并在 Linux 中杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12276125/

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