Frage

Ich habe ein paar Implementierungen von popen gesehen () / pclose (). Sie alle verwendet, um eine statische Liste von PIDs und keine Verriegelung:

static int *pids;
static int fds;

if (!pids) {
        if ((fds = getdtablesize()) <= 0)
            return (NULL);
        if ((pids = malloc(fds * sizeof(int))) == NULL)
            return (NULL);
        memset(pids, 0, fds * sizeof(int));
    }

Oder diese, angeblich NetBSD:

static struct pid {
    struct pid *next;
    FILE *fp;
    pid_t pid;
} *pidlist; 

    /* Link into list of file descriptors. */
    cur->fp = iop;
    cur->pid =  pid;
    cur->next = pidlist;
    pidlist = cur;

Ist es, wie es aussieht - eine nicht sichere Implementierung fädelt? Oder bin ich etwas fehlt offensichtlich?

War es hilfreich?

Lösung

Die NYS Umsetzung ist THREAD wenn libc konfiguriert ist Reentry zu sein (was es wahrscheinlich zu sein). Dies kann jedoch nicht der Fall für andere Implementierungen von libc sein.

Andere Tipps

Ich glaube nicht, dass Sie etwas offensichtlich sind vermisst. Ich sehe keinen Hinweis auf Thread-Sicherheit mit popen () entweder erfordert es Thread-sicher sein oder nicht. Als Ergebnis sollten Sie es wahrscheinlich als nicht-Thread-sicher behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top