Skip to content

Commit

Permalink
kernel: wait for child process to die before closing pty
Browse files Browse the repository at this point in the history
  • Loading branch information
fingolfin authored and ChrisJefferson committed Oct 2, 2024
1 parent fa2aafa commit 00e1e10
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions src/iostream.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,13 +1007,11 @@ static Obj FuncSIGNAL_CHILD_IOSTREAM(Obj self, Obj stream, Obj sig)
static Obj FuncCLOSE_PTY_IOSTREAM(Obj self, Obj stream)
{
UInt pty = HashLockStreamIfAvailable(stream);
int status, retcode;

// Close down the child
int status;
kill(PtyIOStreams[pty].childPID, SIGTERM);
int retcode = close(PtyIOStreams[pty].ptyFD);
if (retcode)
Pr("Strange close return code %d\n", retcode, 0);

// GAP (or another library) might wait on this PID before
// we handle it. If that happens, waitpid will return -1.
retcode = waitpid(PtyIOStreams[pty].childPID, &status, WNOHANG);
Expand All @@ -1028,6 +1026,10 @@ static Obj FuncCLOSE_PTY_IOSTREAM(Obj self, Obj stream)
retcode = waitpid(PtyIOStreams[pty].childPID, &status, 0);
}

retcode = close(PtyIOStreams[pty].ptyFD);
if (retcode)
Pr("Strange close return code %d\n", retcode, 0);

PtyIOStreams[pty].inuse = 0;

FreeStream(pty);
Expand Down

0 comments on commit 00e1e10

Please sign in to comment.