[devel] Как пройти сборку если требуется /dev/shm ?
Andrew V. Stepanov
stanv на altlinux.ru
Вт Дек 30 17:53:59 MSK 2014
Как выяснилось, Python тут ни причем.
Рассмотрим компьютер в котором один однопоточный процессор, с одним ядром.
И рассмотрим семафор Posix.
$ cat 1.c
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc, char **argv)
{
sem_t *mutex;
if ((mutex = sem_open("mysemaphore", O_CREAT, 0644, 1)) ==
SEM_FAILED) {
perror("semaphore initilization");
exit(1);
}
exit(0);
}
$ gcc 1.c -lpthread
$ ./a.out
semaphore initilization: Function not implemented
Т.е. POSIX семафоры в Linux хотят /dev/shm
Хотеть семафор даже на однопроцессорной машине __вполне законно__.
Python multiprocessing модуль написан с использованием POSIX семафоров,
что также вполне законно.
Что видно:
File "/usr/src/RPM/BUILD/bro-2.3.1/aux/btest/btest", line 198, in
runSubprocess
q = multiprocessing.Queue()
File "/usr/lib64/python2.7/multiprocessing/__init__.py", line 218, in
Queue
return Queue(maxsize)
File "/usr/lib64/python2.7/multiprocessing/queues.py", line 63, in
__init__
self._rlock = Lock()
File "/usr/lib64/python2.7/multiprocessing/synchronize.py", line 147,
in __init__
SemLock.__init__(self, SEMAPHORE, 1, 1)
File "/usr/lib64/python2.7/multiprocessing/synchronize.py", line 75,
in __init__
sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 38] Function not implemented
Семафоры нужны даже на однопоточных машинах.
А POSIX семафоры хотят /dev/shm
В конкретно в моем случае:
http://git.altlinux.org/gears/p/python.git?p=python.git;a=blob;f=Python/Modules/_multiprocessing/semaphore.c;h=b9e8f345fbb1cd70918fb960377dadaea46fd8f3;hb=55198a185eef2089e6f4eba8654c5d9047a3c3a7#l195
Вывод: Hasher запрещает использование POSIX named semaphore.
Подробная информация о списке рассылки Devel