Nu har jag kommit en bit till på det här.
SIGKILL har jag avfärdat, det är inte där skon klämmer. Problemet är forkpty, att om jag skapar nya processer med den så lägger det av efter ett tag. Idag skrev jag ett hårt nedskalat exempel på hur det går fel:
---
#include <stdio.h>
#include <util.h>
#include <stdlib.h>
#include <unistd.h>
void RunTest(int i)
{
int pty;
switch(forkpty(&pty, NULL, NULL, NULL))
{
case -1: // Error
printf("pty error after %d\n", i); exit(1);
case 0: // Child
_exit(0);
default: // Parent
close(pty);
}
}
int main(int argc, char *const argv[])
{
int i;
for (i = 0; i < 1000; i++)
RunTest(i);
printf("Successfully ran %i times\n", i);
exit(0);
}
---
// Ultra-minimal pty demo showing the problem I have with failing pty code.
// The program just creates and closes ptys over and over.
// This will fail after pretty exactly 232 runs. (I have also seen 231 and 233.)
// If I don't close the pty, after 30 (running out of ptys).
// So I am running ut of something else. What?
Detta mysigt lilla exemplet skapar alltså pty-baserade processer om och om igen och stänger dem. Och det går... 232 gånger sådär. Sedan är det tvärnit. Vad är det som tar slut? Någon resurs som inte avallokeras?