popen - 锁定还是不安全?

时间:2009-11-09 17:18:31

标签: locking thread-safety popen

我见过popen()/ pclose()的一些实现。他们都使用了静态的pid列表,没有锁定:

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

或者这个,据说是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;

它看起来像什么 - 一个非线程安全的实现?还是我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:3)

我不认为你错过了一些明显的东西。我没有看到对popen()的线程安全性的任何引用要求它是线程安全的。因此,您应该将其视为非线程安全的。

答案 1 :(得分:3)

如果libc配置为可重入(可能是可重入的),则GNU libc implementation是线程安全的。但是,对于其他libc实现可能并非如此。