2012-09-15 24 views
-1

我想運行C代碼中使用克隆裏面的C代碼,我得到了一個錯誤,我無法解決它,任何人在C++之前使用克隆,並可以提供幫助。錯誤克隆系統調用在c + +中的句子

我的代碼:

int variable, fd; 
using namespace std ; 
int do_something() { 
variable = 42;cout << "sana" << endl ; 
close(fd); 
_exit(0); 
} 

int main() { 
void **child_stack; 
char tempch; 

variable = 9; 
fd = open("test.file", O_RDONLY); 
child_stack = (void **) malloc(16384); 
printf("The variable was %d\n", variable); 

clone(do_something, child_stack,CLONE_VM|CLONE_FILES, NULL); 
sleep(1); 

printf("The variable is now %d\n", variable); 
if (read(fd, &tempch, 1) < 1) { 
    perror("File Read Error"); 
    exit(1); 
} 
printf("We could read from the file\n"); 
return 0; 
} 

和我得到了錯誤:

戴爾@ Ubuntu的:〜$ G ++ n.cpp -on n.cpp:在函數 '廉政的main()': (')'(')'(')'(void *)'[-fpermissive] /usr/include/x86_64-linux-gnu/bits無效從'int()()'轉換爲'int() /sched.h:83:12:錯誤:初始化'int clone(int()(void),void *,int,無效*,...)」 [-fpermissive] 戴爾@ Ubuntu的:〜$

+0

我相信你對child_stack **的使用導致了SEGFAULT。雖然不知道clone()的實現和期望,但我無能爲力。 – drescherjm

+0

謝謝你的評論:) – sana

+0

我剛剛查找了clone()的原型。看起來你應該在兩個地方用**替換**。 – drescherjm

回答

5

編譯器會提醒您到clone第一個參數應該是int(*)(void*)(函數指針取一個void*參數和返回int)並且您試圖通過它int(*)()(指向函數的指針,其參數爲參數並返回int)。

前者不能隱式轉換爲後者,因此是錯誤。

要解決它,你可以定義爲do_something

int do_something(void*) 
{ 
    // your code 
} 
+0

@jrock Thnax很多,但它在運行時給了我一個分段錯誤,你能否看到我編輯文本的收益問題,謝謝你 – sana

+0

@sana這個問題值得單獨的問題 - 請張貼另一個問題,不要編輯這樣的問題,因爲它會使答案過時。我會回滾你最新的編輯。 – jrok

+0

其確定..沒問題。 – sana

1

你真的不應該使用clone(2)系統調用。它是(某種)保留式的,例如futex(2) - 用於實現pthread。而C++ 11標準實際上要求將pthread鏈接到已編譯的應用程序中。

如果要使用clone(這是一個可能的錯誤),請將自己限制在C,並小心避免需要使用pthread庫,甚至間接;由您的應用程序。

如果您堅持使用clone,則它的參數child_stack應該適當地對齊(至少對應一頁4Kbytes),並且malloc不能保證。您可以使用mmapposix_memalign

但是真的,請不要使用clone(特別是不能從C++)。使用pthreads。