be a bit more paranoid about killling off child process from
terminology. SVN revision: 74892
This commit is contained in:
parent
fc2796ba79
commit
2f851c1d0a
|
@ -4,6 +4,8 @@
|
||||||
#include "termptyesc.h"
|
#include "termptyesc.h"
|
||||||
#include "termptyops.h"
|
#include "termptyops.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -151,6 +153,8 @@ _cb_exe_exit(void *data, int type __UNUSED__, void *event)
|
||||||
ty->exit_code = ev->exit_code;
|
ty->exit_code = ev->exit_code;
|
||||||
if (ty->cb.exited.func) ty->cb.exited.func(ty->cb.exited.data);
|
if (ty->cb.exited.func) ty->cb.exited.func(ty->cb.exited.data);
|
||||||
|
|
||||||
|
ty->pid = -1;
|
||||||
|
|
||||||
if (ty->hand_exe_exit) ecore_event_handler_del(ty->hand_exe_exit);
|
if (ty->hand_exe_exit) ecore_event_handler_del(ty->hand_exe_exit);
|
||||||
ty->hand_exe_exit = NULL;
|
ty->hand_exe_exit = NULL;
|
||||||
if (ty->hand_fd) ecore_main_fd_handler_del(ty->hand_fd);
|
if (ty->hand_fd) ecore_main_fd_handler_del(ty->hand_fd);
|
||||||
|
@ -354,6 +358,41 @@ err:
|
||||||
void
|
void
|
||||||
termpty_free(Termpty *ty)
|
termpty_free(Termpty *ty)
|
||||||
{
|
{
|
||||||
|
if (ty->pid >= 0)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// in case someone stopped the child - cont it
|
||||||
|
kill(ty->pid, SIGCONT);
|
||||||
|
// signpipe for shells
|
||||||
|
kill(ty->pid, SIGPIPE);
|
||||||
|
// try 400 time (sleeping for 1ms) to check for death of child
|
||||||
|
for (i = 0; i < 400; i++)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
// poll exit of child pid
|
||||||
|
if (waitpid(ty->pid, &status, WNOHANG) == ty->pid)
|
||||||
|
{
|
||||||
|
// if child exited - break loop and mark pid as done
|
||||||
|
ty->pid = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// after 100ms set sigint
|
||||||
|
if (i == 100) kill(ty->pid, SIGINT);
|
||||||
|
// after 200ms send term signal
|
||||||
|
else if (i == 200) kill(ty->pid, SIGTERM);
|
||||||
|
// after 300ms send quit signal
|
||||||
|
else if (i == 300) kill(ty->pid, SIGQUIT);
|
||||||
|
usleep(1000); // sleep 1ms
|
||||||
|
}
|
||||||
|
// so 400ms and child not gone - KILL!
|
||||||
|
if (ty->pid >= 0)
|
||||||
|
{
|
||||||
|
kill(ty->pid, SIGKILL);
|
||||||
|
ty->pid = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ty->hand_exe_exit) ecore_event_handler_del(ty->hand_exe_exit);
|
if (ty->hand_exe_exit) ecore_event_handler_del(ty->hand_exe_exit);
|
||||||
if (ty->hand_fd) ecore_main_fd_handler_del(ty->hand_fd);
|
if (ty->hand_fd) ecore_main_fd_handler_del(ty->hand_fd);
|
||||||
if (ty->prop.title) eina_stringshare_del(ty->prop.title);
|
if (ty->prop.title) eina_stringshare_del(ty->prop.title);
|
||||||
|
|
Loading…
Reference in New Issue