2011-02-02 47 views
6

fork() sistem çağrısına aşırı yükledim ve RTLD_NEXT kullanarak kendi sürümüm fork()'u oluşturdum. Yani, dlsym(RTLD_NEXT, fork). Bu benim çatal sürümüne vuracak. Bundan sonra, gerçek fork() sistem çağrısının görevini çoğaltmak istiyorum; yani, alt işlem oluşturmak ve pid'i döndürmek ve bazı daha fazla işlevsellik.Aşırı yükleme çatalı()

Bunu nasıl yapacağımı anlayamıyorum. fork() (fork.c) için çekirdek kaynak kodunu kontrol ettim ve çok fazla şey anlayamadım.

Bunu yapmak:

dlsym(RTLD_NEXT,fork); 
int fork(void) { 
    int pid=_fork(); // Trying to call actual fork does not work 
    return pid; 
} 

Bunu nasıl yapabilirim? (Yorumlardan çekti) http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10

Düzenleme: Burada çatal için kaynak kodu çekirdek link

Ben aracı tespit sızıntı üzerinde çalışıyorum ve alet çift serbest bir çocuk sürecini algılar Ebeveyn tarafından ayrılan belleği siler. Bunu aşmak için fork()'u geçersiz kılacağım ve bir fork() olduğu zaman, ebeveynin bellek ayırma tablosu çocuğa çoğaltılacaktır.

+0

"Çalışmıyor" ile ne demek istiyorsun? Çalışma zamanı hataları? Derleyici hataları? – Simone

+0

@ Simone: _fork(); // Hata: _fork bildirilmedi. Benim fikrim, onun, çatalın gerçek çekirdek versiyonunu vurmasını ve benimkini yapmamasını sağlamaktı. Umarım şimdi açık hale getirir. – kingsmasher1

+0

Tam olarak ne yaparak bunu yapmak ister misiniz? Son hedefin nedir? – Omnifarious

cevap

3

<sys/syscall.h> ürününü dahil ettikten sonra, syscall(SYS_fork) numaralı fork numaralı telefonu arayabilmeniz gerekir. syscall(2)'a bakın.

+0

Gerçekten bir 'fork' sistemi çağrısı olduğundan emin değildim. Belirli bir parametreler kümesiyle bir "klon" çağrısına çevrildiğini düşündüm. – Omnifarious

+0

@larsmans: Bu iyi bir fikir veriyor! Harika. Şimdi bunu deneyeyim ve çalışıp çalışmadığını göreyim. – kingsmasher1

+0

@Omnifarious: hala çalışıyor. Geriye doğru uyum, sanırım. –

7

fork için çekirdek kaynak kodundan yararlı bir şey almayacaksınız. Kodunuzun, ne tür kütüphane hileleri ile yönettiğinize bakılmaksızın çekirdeğin yapmasına izin verilmeyecektir. Çekirdek bir modül yazmadan kırılamayacak kadar zor bir sınır.

fork için tüm kitaplık kodu, kernel'in fork kodunun yürütüldüğü kernel moduna geçiş yapan özel bir yönerge hazırlar ve çalıştırır. Bu özel talimatı kendi kodunuza koymanın bir yolu vardır. syscall işlevi. fork argüman almadığından, sistem çağrısını yapmak için bu işlevi kullanmak nispeten kolay olmalıdır.

Ama bunu yapmanızı tavsiye ettiğim şey bu değil. Ben bunun yerine bunu tavsiye: yapmanız kütüphane hackery paylaşılan her ne

Temelde
typedef int (*forkfunc_t)(void); 

int fork(void) 
{ 
    forkfunc_t sysfork = (forkfunc_t)dlsym(RTLD_DEFAULT, "fork"); 
    return sysfork(); 
} 

, temelde kendi ile tekrar takmadan önce fork fonksiyonun önceki değerini almak bir yolunu bulmalıdır.

+0

Bir sızıntı tespit aracı üzerinde çalışıyorum ve bu araç, bir alt işlem ebeveyn tarafından ayrılan belleği silen bir çift serbest algılar. Bunu aşmak için fork'u() geçersiz kılacağım ve bir fork() olduğunda, ebeveynin bellek ayırma tablosu çocuğa kopyalanacaktır. – kingsmasher1

+0

@ kingsmasher1: Ahh, yani çekirdeğin 'fork'la ne yaptığını değiştirmenize gerek yok, sadece onu engellediğinden ve uygun şekilde sardığından emin olmalısın. Bu çok mantıklı ve paylaşımlı kütüphane tekniğiniz bunun için çok kötü bir yol değil. – Omnifarious

+0

@ kingsmasher1 Yorumunuzu oldukça önemli bir bilgi parçası olduğu için sorunuza düzenledim! Bundan memnun değilseniz, devam edin ve düzenleyin. –

0

Eğer kötü hack olduğundan, her neyse, neden sadece kullanmayan bir makro

#define fork() (spoon(),fork()) 

veya spoon, yapmak istediğiniz şeyler yapar işlevi daha sonra

#define fork() spoon(fork()) 

.

Önişlemci, özyineleme yapmamaya garantilidir ve fork'u yalnızca dışlamada bırakın.

+0

problemim çatal() aşırı yükleme değildi. Ben "dlsym" sys çağrısı kullanarak aşırı yüklendi. Benim sorunum, fork() 'ın işini nasıl kopyalayacağımdı, yine de şu anda larsanın önerisini kullanarak bunu başarabildim ve problemim çözüldü. Her neyse. – kingsmasher1