В последнее время у меня возникают проблемы с вызовом popen, кажется, что он не безопасен для потоков.
Ниже приведен фрагмент кода из ссылки на исходный код: http://androidxref.com/9.0.0_r3/xref/bionic/libc/upstream-netbsd/lib/libc/gen/popen.c
static struct pid {
struct pid *next;
FILE *fp;
int fd;
pid_t pid;
} *pidlist;
static rwlock_t pidlist_lock = RWLOCK_INITIALIZER;
FILE *
popen(const char *command, const char *type)
{
struct pid *cur, *old;
...
pipe2(pdes, flags) // A
...
(void)rwlock_rdlock(&pidlist_lock); // C
...
switch (pid = vfork()) { // C.1
case 0: /* Child. */
...
_exit(127);
/* NOTREACHED */
}
/* Parent; */
...
/* Link into list of file descriptors. */
cur->fp = iop;
cur->pid = pid;
cur->next = pidlist; // D
pidlist = cur; // E
(void)rwlock_unlock(&pidlist_lock); // F
...
}
Наблюдая за приведенным выше кодом, он получил блокировку чтения в C, но внутри области он выполнил некоторые операции записи в E. Так что, возможно, будет несколько потоков чтения, которые записывают в переменную "pidlist" вв то же время.
Кто-нибудь знает, является ли это истинной проблемой или нет?