2012-09-15 27 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。