Hallo Gruppe,
ich habe einen C-Code an Python mit der C-API angebunden, der u.a. einen
fork() mit einem exit() macht.
Der C-Code sieht etwa so aus (library und Code zusammengeworfen):
-------------------8<------------------------------
#include <unistd.h>
#include <Python.h>
static PyObject *bar(PyObject *self) {
pid_t childpid = fork();
if (childpid == 0) exit(0);
sleep(1);
return Py_BuildValue("s", "Ready.");
}
static PyMethodDef foo_methods[] = {
{"bar", (PyCFunction)bar, METH_NOARGS, "Bla"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initfoo(void) {
Py_InitModule("foo", foo_methods);
}
-------------------8<------------------------------
Das Beispielmodul kann man mit einem trivialen setup.py einbinden:
-------------------8<------------------------------
from setuptools import setup, Extension
module1 = Extension('foo', sources = [foo.c'])
setup (name = 'foo', packages = ['foo'], ext_modules = [module1])
-------------------8<------------------------------
Wenn ich damit folgendes mache:
-------------------8<------------------------------
a = open("a.dat", "w");
for i in range(10):
foo.bar()
a.write(" %i" % i)
a.close()
-------------------8<------------------------------
dann sieht "a.dat" so aus:
-------------------8<------------------------------
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5 0 1 2 [...]
-------------------8<------------------------------
Offenbar versucht jedes Kindprogramm den Cache zu leeren. Ein Ersetzen
von exit() im C-Code durch _exit() ändert daran jedoch auch nichts.
Eine analoge Funktion die man direkt aus C heraus aufruft, zeigt dieses
Verhalten nicht, daher scheint es sich um ein CPython-Spezifikum zu
handeln.
Warum ist das so und wie kann ich das verhindern?
Viele Grüße
Ole