Domanda

Ho visto alcune implementazioni di popen () / pclose (). Tutti hanno usato un elenco statico di pid, e nessun blocco:

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));
    }

O questo, presumibilmente 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;

E 'quello che sembra - una non infilare realizzazione sicura? O mi manca qualcosa di ovvio?

È stato utile?

Soluzione

Il GNU libc implementazione è threadsafe se libc è configurato per essere rientrante (che è probabile che sia). Tuttavia, questo non può essere il caso per altre implementazioni di libc.

Altri suggerimenti

Non credo che ti manca qualcosa di ovvio. Non vedo alcun riferimento al filo di sicurezza con popen () o richiedono di essere thread-safe o meno. Di conseguenza si dovrebbe probabilmente trattarla come non-thread-safe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top