我正在做自己的shell,但在执行过程中遇到了问题。
在我的fork之后,我做了一个文件的execve,但如果文件不是二进制文件,那么我的儿子不会退出,所以我有一个无限循环。 我知道我可以退出()我的孩子,但我不想使用它。
还有其他任何可能性来杀死它吗?
我已经尝试过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);
}
答案 0 :(得分:1)
最后为了杀死我的过程,我做了kill(getpid(), SIGTERM)
并且效果很好。
答案 1 :(得分:-2)
我知道你已经声明你已经尝试过了,但在我看来发送SIGTERM或SIGKILL是最好的方法。
使用“kill(pid,SIGKILL);”语法绝对不应该杀死除pid之外的任何进程。 我唯一的建议是确保在kill调用中使用的pid是儿子的pid,而不是父节点。
同时检查儿子的pid是否被设置为等于对父母pid的引用,因为你可能认为你传递了儿子的pid并且它确实指向父母的pid数据。只是我的想法。
请参阅以下手册页:http://linux.die.net/man/2/kill