попен - замки или не нить безопасны? - PullRequest
2 голосов
/ 09 ноября 2009

Я видел несколько реализаций popen () / pclose (). Все они использовали статический список пидов и без блокировки:

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 ]

3 голосов
/ 09 ноября 2009

Реализация GNU libc является поточно-ориентированной, если libc настроен для реентерабельности (что может быть). Тем не менее, это может быть не так для других реализаций libc.

3 голосов
/ 09 ноября 2009

Я не думаю, что вы упускаете что-то очевидное. Я не вижу никаких ссылок на потокобезопасность с помощью popen (), требующих, чтобы он был потокобезопасным или нет. В результате вы, вероятно, должны рассматривать его как не ориентированный на многопотоковое исполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...