Did I mess something up or did the glibc writers deliberately choose to implement vfork() using SYS_vfork instead of SYS_clone for a reason?
Historicamente, acho mais provável que isso seja simplesmente o resultado de vfork
não precisar ser alterado. Tanto vfork
como fork
usaram inicialmente as chamadas de sistema equivalentes. Quando a segmentação NPTL foi implementada, a implementação fork
foi alterada para usar clone
, porque a biblioteca C precisa redefinir o ID do encadeamento . vfork
não precisa se preocupar com os tópicos, porque ele é destinado apenas ao uso com execve
(que redefinirá todo esse estado de qualquer maneira), por isso não foi alterado.
O documento de projeto NPTL explica por que a chamada do sistema fork
não é suficiente para implementar o fork
chamada de biblioteca quando os threads podem ser usados:
To implement the
fork
function without memory leaks it is necessary that the memory used for stacks and other internal information of all threads except the thread callingfork
is reclaimed. The kernel cannot help in this situation.
Is this considered something that could change at any time or can we rely on it?
Como você usa a biblioteca C como bifurcação, só pode confiar na biblioteca C que fornece o comportamento documentado nas APIs. você não pode confiar em uma implementação específica. Você não deve confiar em vfork(3)
usando a chamada de sistema vfork(2)
em vez de clone(2)
, nem deve confiar em fork(3)
usando clone(2)
em vez de fork(2)
. Note que as chamadas do sistema que são usadas podem variar de uma arquitetura para outra ...
Se você realmente precisar confiar em chamadas específicas do sistema, você deve usá-las diretamente e abrir mão dos invólucros da biblioteca C.