gpt4 book ai didi

调用 "fork() execvp() _exit()",进程没有退出

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:49 28 4
gpt4 key购买 nike

所以简短的总结是-我有一个程序递归搜索具有特定扩展名的文件。每次找到一个,它都会制作一个副本,对副本进行一些更改,创建一个补丁(通过使用 diff 和 execvp())并删除原始文件。

我遇到的问题是,在数百个文件之后,fork() 返回“资源暂时不可用”。我添加了一个计数器来查看发生此故障时有多少进程仍在运行,看起来没有关闭 - 打开的进程数始终与处理的文件数相同。

现在,我的印象是流程应该是这样的——fork();//创建一个子进程dostuff();//在子进程中_exit(1);//把控制权还给父级

但事情似乎并没有那么简单。也许这里有人会发现我在代码中遗漏了一些明显的东西。

我已经发布了负责 fork 和修补的“清理”功能 - 其余部分分为几个文件,所以希望这就足够了。

(参数“name”为原始文件名,“newname”为修改后的副本。)

void cleanup (char * name, char * newname)
{
if (pf)
{
pid_t patch_pid;

char * const diffargs[5] = {thisdiff, "-u", newname, name, NULL};

char * patchname = malloc(strlen(name) + 6);
strcpy(patchname, name);
strcat(patchname, ".patch");

if((patch_pid = fork()) < 0 )
{
printf("fork failed.\n%s\nfilecount: %ld\nopen forks: %d\n", strerror(errno), filecount, pcount);
exit(-1);
}

pcount++;

if (patch_pid == 0)
{
FILE *pfp;
if ((pfp = fopen(patchname, "w")) == NULL)
{
printf("Error opening file \"%s\" for writing.\n%s\n", patchname, strerror(errno));
exit(-1);
}

dup2(fileno(pfp), STDOUT_FILENO);
fclose(pfp);
execvp(diffargs[0], diffargs);
free(patchname);

if (remove(name) != 0)
{
printf("Error removing file %s\n%s\n", name, strerror(errno));
exit(-1);
}

if (rename(newname, name) != 0)
{
printf("Error renaming file %s\n%s\n", newname, strerror(errno));
exit(-1);
}
pcount--;
_exit(1);
}
}

else if (!df && !xf)
{
if (remove(name) != 0)
{
printf("Error removing file %s\n%s\n", name, strerror(errno));
exit(-1);
}
if (rename(newname, name) != 0)
{
printf("Error renaming file %s\n%s\n", newname, strerror(errno));
exit(-1);
}
}
}

最佳答案

两个建议:

  1. 了解 exec*() 替换您的进程(如果成功)。它后面的任何代码都是不可访问的。
  2. 使用 wait*() 函数之一获取已退出进程的退出状态;可能在 SIGCHLD 的信号处理程序中。
  3. 额外建议:阅读 W. Richard Stevens 的Unix 环境高级编程;这是执行此类任务的圣经。

关于调用 "fork() execvp() _exit()",进程没有退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24654264/

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