Собираюсь писать защиту на основе сетей Петри под linux (as). Возникла проблема, как создавать и главное как обеспечивать взаимодействие между потоками, которые осуществляют запуск переходов. Glibc функции не хочется юзать по идейным соображениям, так что pthread отпадает, а IPC-механизмы это как-то уже слишком. Как можно обеспечить многопоточность используя только сисколы, причём потоки должны уметь получать/изменять информацию о позициях в главном процессе? clone не подходит под вышеперечисленные требования.
Неохота вникать в то, что такое сети Петри. Два вопроса: Что за позиции? Можно ещё раз перечислить вышеперечисленные требования, под которые не подходит clone? clone не имеет никакого отношения к glibc и pthreads, и не является IPC механизмом. Какие из требований я пропустил? Вообще есть два способа создать задачу -- fork и clone. Если не устраивает clone, то остаётся fork. Используя же fork, и желая взаимодействия между процессами не удастся обойтись без IPC. По-определению не удастся, ибо IPC -- это Inter-Process Communication во всех его проявлениях, начиная с пайпа и заканчивая ptrace. Вопрос какого типа IPC использовать. Но это уже зависит от того, какого типа взаимодействие нужно.
clone это ничто иное как системный вызов как и fork более того fork часный случай от clone так же есть системный вызов pipe для обмена между двумя процессами впринцие только этих 2х функций достаточно для реализации процессов и взаимодействия между ними
Я в курсе что такое IPC, fork, pthread. Вот про Clone не дочитал немного, что у него есть флаг CLONE_VM для разделения памяти с парентом. В манах написано, что надо для стека call'a нужно выделить память malloc'ом. А будет ли работать, если сделать что то вроде sub esp, <n> и передать в clone esp как адрес? И так для каждого потока. Просто потом всё это дело прийдётся восстанавливать.
можно. например так выделяем память Код (Text): movl %esp,%eax subl $n,%esp push %esp и для освобождаем память Код (Text): popl %esp можео выделить память из .bss Код (Text): .section .bss ptr: .lcomm buff, 32 а самый правильный способ это выделить память через системный вызов brk или mmap
_MemoryAllocate: ;Allocate a memory block ;Input: ; eax - the size of memory for the allocation ;Ouput: ; eax - the handle of an allocated block of memory ; eax = 0ffffffffh - a error ;Save registers sub esp,(4+4*10) mov [esp+4*10],ebx ;Allocate a memory block mov dword [esp],0 mov dword [esp+4],eax mov dword [esp+8],3 mov dword [esp+0ch],21h mov ebx,esp mov dword [esp+10h],0ffffffffh mov dword [esp+14h],0 mov eax,5ah int 80h ;Process a error mov ebx,eax and ebx,0ffffff00h cmp ebx,0ffffff00h cmove eax,[esp+10h] ;Restore registers mov ebx,[esp+4*10] add esp,(4+4*10) ret _MemoryFree: ;Free a memory block ;Input: ; eax - a handle of an allocated block of memory to free ; [esp+4] - the size of memory ;Save registers sub esp,4*2 mov [esp],ebx mov [esp+4],ecx mov ebx,eax ;Free a memory block mov ecx,[esp+4+4*2] ;Size of memory to free mov eax,5bh int 80h ;Restore registers mov ebx,[esp] mov ecx,[esp+4] add esp,4*2 ret 4