gpt4 book ai didi

c - 销毁进程树并释放它分配的所有内存-Linux-C

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

如果您知道进程的pid,有没有办法销毁从该进程创建的hole进程树并释放这些进程分配的所有内存?我需要在C程序中找到一种方法来实现这一点,而不必转到树的每个进程。
下面是我在阅读了Basile Starynkevitch非常有用的答案后编写的代码。

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

void proctreecreator(int count);

int main()
{
int status,count;
count = 0;
pid_t pid,procapid;
pid = fork();
if (pid < 0) {
perror("main: fork");
exit(1);
}
if (pid == 0)
{
if( setpgid(0,0) <0 ) perror( "main: setpgid" );
proctreecreator(count);
exit(1);
}
procapid=pid;
pid = fork();
if (pid < 0) {
perror("main: fork");
exit(1);
}
if (pid == 0)
{
sleep(1);
printf("I will now destroy the process tree \n");
kill(-procapid, SIGTERM);
exit(0);
}
procapid = waitpid(procapid, &status, 0);
if (procapid < 0) perror( "main: waitpid" );
else printf("Process A and its tree are killed\n");
pid = waitpid(pid, &status, 0);
if (pid < 0) perror("main: waitpid");
else printf("process B exited \n");
return 0;
}

void proctreecreator(int count)
{
pid_t pid;
int status,i;
int *k = (int*)malloc(sizeof(int));
*k=count;
pid_t mypid=getpid();
printf("process with pid : %d created in depth %d \n",mypid,count);
if (count > 3)
{
sleep(5);
free(k);
exit(0);
}
else
{
count++;
pid = fork();
if (pid < 0) {
perror("proctreecreator: fork");
exit(1);
}
if (pid == 0)
{
proctreecreator(count);
exit(1);
}
pid = fork();
if (pid < 0) {
perror("proctreecreator: fork");
exit(1);
}
if (pid == 0)
{
proctreecreator(count);
exit(1);
}
for (i=0; i<2; i++)
{
pid = wait(&status);
if (pid < 0) perror("proctreecreator: wait");
else printf("process %d is now terminated",pid);
}
free(k);
exit(0);
}
}

我有一些关于程序如何工作的问题!当使用kill(-procapid,sigterm)时,销毁进程树需要固定的时间还是取决于树的大小?在kill(-procapid,sigterm)之后,所有用malloc分配的内存是否都是空闲的?

最佳答案

当aprocess终止时,它所使用的所有virtual memory都会被释放(除了heap)。
用于(强制)终止某个其他进程的managedmmap(2),它确切地向进程(或进程组)发送shared memory。阅读system call。如果流程树中的所有流程都属于同一个kill(2)(请参见signal…),则只需malloc该流程组。另请参见signal(7)
你应该先用freekill。这为表现良好的程序(如许多process group服务器)提供了适当处理该信号的机会(例如释放资源、清理等)。一秒钟后,你可以用killSIGTERM。最后,您可以发送kill信号,该信号不能被捕获,并且将始终终止进程。
同时阅读会话和控制终端。另请参见credentials(7)页和killpg(2)Wikipage。
请注意,某些处理仍可能继续。假设您的一些流程是RDBMSsetsid(2)SIGQUIT(或SIGKILL
因此,您的第一个程序派生了一些/usr/bin/batch;将其调用ssh(有关详细信息,请参见setpgid(2))。当然,您的第一个程序需要保留A的pid(由tty demystified返回),假设它在setpgid(0,0)中;然后您需要稍后A并最终pid_t pid_of_A(请参见job control…)。
阅读execve(2)
您通过添加以下内容编辑了问题:
有一些关于程序如何工作的问题!使用kill(-pid_of_A, SIGTERM)时,销毁进程树是否需要固定的时间,还是取决于树的大小?
这真的应该是另一个问题。“杀戮过程群”的理论复杂性不应在实践中困扰你。原因是在实践中,您没有太多(正在运行的)进程;您只希望有几十个正在运行的进程(否则,您的整个系统和计算机将超载并开始batch(1)),除非您是在数百万美元的setpgid(2)上运行。因此,杀死过程树的实际复杂性并不重要,因为在实践中,过程树只会有几十个运行过程(总共有几百个进程,其中大部分是空闲的)。
你还问
waitpid(pid_of_A, &status_of_A, 0)之后,是否所有分配了malloc free的内存?
阅读有关fork(2)waitpid(2)Advanced Linux Programming的更多信息。请理解每个进程使用supercomputer并有自己的thrashingkill(-procapid, SIGTERM)使用例如processes来更改正在运行的进程的地址空间(仅限)。
当进程终止时,其整个地址空间将被内核删除。这与kill没有直接关系。kill(-procapid, SIGTERM);因为有些进程会捕获malloc以进行有用的清理。(换句话说,将kill(发送到某个进程并不总是立即终止它)。
fork system call正在详细解释这一点,比我必须做的要好得多。
是的,创建一个进程(使用fork bombs)、终止一个进程(因为某些进程终止了virtual memory,或者因为它有轻微的address space-ed)、用进程中的另一个程序替换正在运行的程序(使用mmap(2)..)以及更改正在运行的进程的地址空间(使用SIGTERM)..经常使用的Advanced Linux Programming)是复杂而昂贵的操作,但是fork(2)是做得很好。
流程是相当庞大的资源,因此您不应该拥有大量的流程。因此signal(7)不是对它们进行推理的正确概念。你想拥有其中的“少数”(而“少数”的含义取决于你的特定系统和硬件)。现在,我的i3770k linux/debian桌面(16gbytesram)有238个进程,其中大多数都是空闲的(在终端中运行SIGTERM来查找),只有少数进程在运行。最新的linux内核有一个有效的_exit(2),通常是一个execve(2)
据说Linux非常擅长管理进程,并且在Linux上创建进程比在Windows上创建进程要快。

关于c - 销毁进程树并释放它分配的所有内存-Linux-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21502821/

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