如何正确地杀死叉子的儿子
How to killing the son of a fork properly
我正在做我自己的shell,但是在执行过程中我有问题。
在我的fork之后,我执行一个文件,但是如果这个文件不是二进制文件,那么我的儿子就不会退出,所以我有一个无限循环。我知道我可以退出()我的孩子,但我不想使用它。
还有其他杀死它的方法吗?
我已经尝试了kill(pid, SIGTERM);
,但它也杀死了父节点。
你知道吗?
这是我的代码:
int son(int *fd_in, int p[2], t_list *cmd, char **env, int pid)
{
(void)env;
signal(SIGINT, SIG_DFL);
if (g_fd != -1)
{
dup2(g_fd, 0);
g_fd = -1;
}
dup2(*fd_in, 0);
if (cmd->act != ENDACT && cmd->act != LEFT && cmd->act != DLEFT)
dup2(p[1], 1);
close(p[0]);
if ((execve(cmd->av[0], cmd->av, env)) == -1)
{
kill(pid, SIGTERM);
}
return (0);
}
t_list *execute_pipe(t_list *cmd, int *fd_in, int *status, char **env)
{
int p[2];
pid_t pid;
*fd_in = 0;
while (cmd->act != -1)
{
pipe(p);
if ((pid = fork()) == -1)
return (NULL);
else if (pid == 0)
son(fd_in, p, cmd, env, pid);
else
{
close(p[1]);
*fd_in = p[0];
if (cmd->act != PIPE)
{
while (waitpid(pid, status, WUNTRACED) > 0);
return (cmd);
}
cmd = cmd->next;
}
}
while (waitpid(pid, status, WUNTRACED) > 0);
return (cmd);
}
最后结束我的进程,我做了kill(getpid(), SIGTERM)
,它运行良好。
我知道您已经说过您尝试过了,但是在我看来,向它发送SIGTERM或SIGKILL是最好的方法。
使用"kill(pid, SIGKILL);"语法绝对不应该杀死任何进程,除了等于pid的进程。我唯一的建议是确保在kill调用中使用的pid是子进程的,而不是父进程的。
还要检查子进程的pid是否被设置为与父进程的pid的引用相等,因为你可能认为你传递的是子进程的pid,而实际上它指向父进程的pid数据。只是我的想法。
参见以下手册:http://linux.die.net/man/2/kill
相关文章:
- 如何正确地将分支添加到已存在的树中
- 如何正确地将带有指针的数组传递给函数
- 如何正确地推回然后遍历堆中对象的向量?
- 我是否不正确地集中了这些字符数组?
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 我怎样才能通过友谊正确地履行我的职能?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 我应该如何正确地将packaged_task移动到 lambda?
- 如何正确地将SHA1CryptoServiceProvider转换为c ++?
- 如何正确地对 constexpr 函数进行单元测试
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何正确地将boost::asio::buffers_iterator转换为InputIterator
- 如何正确地检查变量char中包含的字母
- 当试图交换可变模板类时,如何正确地重载operator=
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 如何在C++中正确地将我的语言字符输出到HTML文件中
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 如何正确地编写这些条件,以便它们在控制台中工作
- 正确地编写一个类,并将pthread与vlc库和c++一起使用
- 如何正确地杀死叉子的儿子