-1

内部で clone を使用する 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: 関数 'int main()': n.cpp:40:62: エラー: 'int ( )()' から 'int ( )への変換が無効です(void*)' [-fpermissive] /usr/include/x86_64-linux-gnu/bits/sched.h:83:12: エラー: 'int clone(int ( )(void ), void*, int, void*, ...)' [-fpermissive] dell@ubuntu:~$

4

2 に答える 2

5

コンパイラーは、への最初の引数が(1つのパラメーターを取り、返す関数へのポインター)cloneであるはずであり、それを渡そうとしている(パラメーターを受け取ら、返す関数へのポインター)ことを通知しています。int(*)(void*)void*intint(*)()int

前者を暗黙的に後者に変換することはできないため、エラーが発生します。

これを修正するには、次のように定義できますdo_something

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

clone(2)システムコールは絶対に使用しないでください。pthread の実装に対して(一種の) futex(2)のように予約されています。また、C++11 標準では、コンパイルされたアプリケーションに pthread をリンクすることが実質的に要求されます。

使用したい場合clone(これは間違いである可能性があります)、C に限定し、pthread間接的であってもライブラリが必要になることを慎重に避けてください。あなたのアプリケーションによって。

どうしても使用したい場合はclone、そのchild_stack引数を適切に (少なくとも 4K バイトのページに) 配置する必要がありますが、それをmalloc保証するものではありません。mmapまたはを使用できますposix_memalign

しかし、実際には使用しないでくださいclone(特に C++ からではありません)。pthread を使用します。

于 2012-09-15T14:21:33.927 に答える