-1

我正在尝试在内部使用克隆的 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;
}

我得到了错误:

dell@ubuntu:~$ g++ n.cpp -on n.cpp: In function 'int main()': n.cpp:40:62: error: invalid conversion from 'int ( )()' to 'int ( ) (void*)' [-fpermissive] /usr/include/x86_64-linux-gnu/bits/sched.h:83:12: 错误:初始化参数 1 的 'int clone(int ( )(void ), void*, int, void*, ...)' [-fpermissive] dell@ubuntu:~$

4

2 回答 2

5

编译器告诉你第一个参数clone应该是int(*)(void*)(一个指向带一个void*参数并返回的函数的指针int)并且你试图传递它int(*)()(一个指向带参数并返回的函数的指针int)。

前者不能隐式转换为后者,因此会出现错误。

要修复它,您可以定义do_something为:

int do_something(void*)
{
    // your code
}
于 2012-09-15T12:20:55.103 回答
1

你真的不应该使用clone(2)系统调用。它是(某种)保留的 - 像futex(2) - 用于 pthread 的实现。而 C++11 标准实际上要求将 pthread 链接到已编译的应用程序中。

如果您想使用clone(这可能是一个错误),请将自己限制为 C,并小心避免pthread需要该库,即使是间接的;通过您的应用程序。

如果您坚持使用clone,它的child_stack参数应该适当地对齐(至少到 4Kbytes 的页面),并且malloc不保证这一点。您可以使用mmapposix_memalign

但实际上,不要使用clone(尤其不是来自 C++)。使用 pthread。

于 2012-09-15T14:21:33.927 回答