Aradığınızda vfork()
, yeni bir işlem oluşturulur ve bu yeni işlem, yığının haricinde üst işlemin işlem görüntüsünü ödünç alır. Alt sürece kendi yeni bir yığın yıldız verilir, ancak return
çağrılan işlevden izin verilmez vfork()
.
Çocuk çalışırken, üst öğenin adres alanını ödünç aldığından üst işlem engellenir.
Ne yaparsanız yapın, yığına erişen her şey yalnızca çocuğun özel yığınını değiştirir. Bununla birlikte, genel verileri değiştirirseniz, bu ortak verileri değiştirir ve böylece üst öğeyi de etkiler.
Global verileri değiştiren şeyler:
malloc () veya free () çağrısı
stdio kullanma
sinyal ayarlarını değiştirme
çağrılan işleve yerel olmayan değişkenleri değiştirme vfork()
.
...
Aradığınızda _exit()
(önemli, asla aramayın exit()
), çocuk feshedilir ve kontrol ebeveyne geri verilir.
exec*()
Ailenin herhangi bir işlevini çağırırsanız , yeni program kodu, yeni veriler ve üst öğeden yığının bir kısmı ile yeni bir adres alanı oluşturulur (aşağıya bakın). Bu hazır olduğunda, çocuk artık adres alanını çocuktan ödünç almaz, ancak kendi adres alanını kullanır.
Adres alanı artık başka bir işlem tarafından kullanılmadığından denetim ana öğeye geri verilir.
Önemli: Linux'ta gerçek bir vfork()
uygulama yoktur . Linux , 1988'de SunOS-4.0 tarafından sunulan vfork()
Yazma Üzerine Kopyala fork()
konseptini temel alarak uygular . Kullanıcıların kullandıklarına inandırabilmeleri için vfork()
Linux, paylaşılan verileri ayarlar ve çocuk aramadığında _exit()
veya exec*()
işlevlerden biri varken ebeveynini askıya alır .
Bu nedenle Linux vfork()
, çekirdeğin içindeki bir çocuk için gerçek bir adres alanı tanımlaması gerekmediği gerçeğinden faydalanmaz . Bu vfork()
, daha hızlı olmayan bir sonuç verir fork()
. Bir gerçek uygulayan sistemlerde vfork()
, tipik olarak 3 kat daha hızlıdır fork()
ve kullanılan mermilerin performansını etkiler vfork()
- ksh93
, son Bourne Shell
ve csh
.
Aradığınızda asla nedeni exit()
dan vfork()
ed çocuğun olmasıdır exit()
basması zaman unflushed veri çağırmadan önce olduğu durumda stdio vfork()
. Bu garip sonuçlara neden olabilir.
BTW: posix_spawn()
üstüne uygulanır vfork()
, bu yüzden vfork()
işletim sisteminden kaldırılmaz. Linux kullanmayan söz edilmiştir vfork()
için posix_spawn()
.
Yığın için, birkaç doküman var, Solaris man sayfasının söylediği şey:
The vfork() and vforkx() functions can normally be used the
same way as fork() and forkx(), respectively. The calling
procedure, however, should not return while running in the
child's context, since the eventual return from vfork() or
vforkx() in the parent would be to a stack frame that no
longer exists.
Böylece uygulama istediği her şeyi yapabilir. Solaris uygulaması, işlev çağrısının yığın çerçevesi için paylaşılan bellek kullanır vfork()
. Hiçbir uygulama, üst öğeden yığının eski kısımlarına erişim izni vermez.