2010-05-24 4 views
5

clone işlevinin ad kaldırma özelliklerini kullanmak istiyorum. Manpage'i okumak, endişelenmem gereken pek çok karmaşık ayrıntıya sahip gibi görünüyor.Klon eşdeğeri çatal mı?

iyi ol' fork() eşdeğer clone çağırma var mıdır?

Zaten fork ile tanıdık ve clone içinde bir başlangıç ​​noktası varsa, oradan bayraklar ve seçenekler ekleyebileceğine inanıyorum.

cevap

2

Bunun çalışacağını düşünüyorum, ama işaretçi argümanlar bazıları hakkında tamamen emin değilim. bayraklar ise

pid_t child = clone(child_f, child_stack, 
      /* int flags    */  SIGCHLD, 
      /* argument to child_f  */  NULL, 
      /* pid_t *pid    */  NULL, 
      /* struct usr_desc * tls */  NULL, 
      /* pid_t *ctid    */  NULL); 

bunun alt bayt parçacığı ebeveyn ölen ya durdurma gibi şeyler yapıyor bildirmek için göndermeye hangi sinyalin belirtmek için kullanılır Parametre. Tüm gerçek bayrakların fork'dan farklı anahtarlar açtığına inanıyorum. Çekirdek koduna baktığımızda bunun geçerli olduğu öne sürülüyor.

fork adresine yakın bir şey almak istiyorsanız, işlev göstergesini almayan ve fork gibi iki kez döndüren sys_clone numaralı telefonu aramak isteyebilirsiniz.

+0

Kod dalışına gittim çünkü hala rahat hissetmedim, ama haklı gözüküyor. Ne bulduğum, '' clone'' sys_clone' etrafında çok ince bir sarıcı olduğunu, sadece yeni yığınında 'fn' olarak adlandırmak için gerekli olanı yapıyor. 'sys_clone' aslında 'fork' gibi döner, ancak doğrudan çağrılmaz, çünkü bu imza mimariye göre farklılık gösterir. 'fork' aslında oldukça yağlıdır: geri çağrıları yürütür, yanlış temizleme yapar, ancak temelde sadece SIGCHLD kullanır. (Sanırım 'fork'-extras'ı taklit etmek için yapabileceğim bir şey yok.) –

0

klon() bir iplik oluşturmak için kullanılır. Klon() ve fork() arasındaki büyük fark, clone() işlevinin, ayrı bir giriş noktasından - bir işlevden başlamasıdır; oysa fork(), kodun çağrıldığı yerden aynı noktadan devam eder. manpage tanımındaki int (* fn) (void *), çıkışta int, çıkış durumunu döndüren işlevdir. klonlamak için

yakın arama esasen klon için bir sarıcı() pthread_create() 'dir. Bu, fork() davranışını almanın bir yolunu sağlamaz.

+1

İyi nokta. Ben 'clone' ve 'fork' arasındaki '' f'''' dönüş '' konusunda çok endişelenmiyorum. Amacım, aynı alt işlem özelliklerinin nasıl elde edileceğini (ve ne olduklarını) anlamaktır. Her durumda, 'pthread_create' bana işaret bayraklarını önermiyor. –

1

Sen fork() kullanarak normal bir çocuk sürecini çatal olabilir, o zaman() Yeni bir ad alanı oluşturmak için paylaşımı kaldırmak kullanın.

Ad Onlar için kullanım senaryoları bir sürü göremiyorum, biraz garip.

+1

' 'unshare' 'sadece' clone 'bayraklarının küçük bir alt kümesini destekliyor gibi görünüyor. Örneğin, 'CLONE_NEWNET' kullanmak istiyorum ve 'EINVAL'ı döndürür. –