2009-11-09 5 views
2

J'ai vu quelques implémentations de popen()/pclose(). Ils ont tous utilisé une liste statique de pid et sans verrouillage:popen - verrouille ou non le filetage en toute sécurité?

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

Ou cela, soi-disant 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; 

Est-ce à quoi il ressemble - un fil non mise en œuvre sûre? Ou est-ce que je manque quelque chose d'évident?

Répondre

3

Le GNU libc implementation est threadsafe si la libc est configurée pour être réentrante (ce qu'elle est susceptible d'être). Cependant, cela peut ne pas être le cas pour d'autres implémentations de libc.

+0

oui, je vois qu'il verrouille la liste des enfants. Ceci est vraiment mieux. Merci pour le lien. Je préfèrerais popen retourné un pid et je l'ai passé à pclose, mais ce n'est pas une option pour la libc dans ce cas –

3

Je ne pense pas qu'il vous manque quelque chose d'évident. Je ne vois aucune référence à la sécurité des threads avec popen(), ce qui nécessite soit thread-safe ou non. En conséquence, vous devriez probablement le traiter comme non-thread-safe.

+0

Je me souviens que lorsque les threads étaient supportés, les pages de manuel vous indiquaient explicitement si une fonction était sûre ou non sûre. Maintenant, je m'attends à ce qu'une fonction soit sûre, on ne dit pas autrement .. –

+2

Ce serait bien. Cependant - je renverserais votre attente - les fonctions sont généralement dangereuses à moins que l'auteur ait réellement pensé aux issues de fil. Et si ce n'est pas mentionné dans la page de manuel, ils n'y ont probablement pas pensé. – Aaron

+0

Au moins sur Linux, les pages de manuel ne sont pas nécessairement écrites par les gens de la glibc qui écrivent les implémentations. – bdonlan

Questions connexes