1

私はsycallsで遊んでいて、次の行に沿ってコードを書いたところです。

/* Clone the process and launch Something */
child_stack = (void *) malloc(max_memory);
args = malloc(2 * sizeof (int **));

args[0] = in_socket_fds;
args[1] = out_socket_fds;

clone(foo, child_stack + max_memory ,CLONE_FILES|CLONE_VM|CLONE_IO|CLONE_FS, (void *) args);

wait();

ここで、foo関数は次のとおりです。

    int foo(int** args) {
     fprintf(stderr, "Hello world %d %d", args[0][0], ags[1][0]);
     _exit(0);
    }

私が本当にやりたいのは、foo関数からバイナリを呼び出すことです。

    int foo(int** args) {
     system(start program foo)
     _exit(0);
    }

このバイナリは、同じファイル記述子テーブルを共有する必要があります(したがって、以前はクローンを使用していました)。システムがファイル記述子テーブルを共有することを許可していないと思うので、上記のコードは正しくありません。(私はfdsのコピーは必要ありません、私は本当にそれらを読み書きできるようにしたいです)これらのfdsはソケットです。

    int foo(int** args) {
     system(start program foo)
     _exit(0);
    }

クローンコマンドに関数ではなくバイナリを呼び出させるにはどうすればよいですか?(これも可能ですか)、またはファイル記述子を共有しながらシステムコールを使用しますか?

ありがとう

4

1 に答える 1

4

fork()/execlp()の代わりにclone()/を選択してくださいsystem()。フォークされた子は親からファイル記述子を継承し、execlp()(またはその親戚)は子に別の実行可能ファイルをロードできるようにします。

によって呼び出される関数(コメントを参照)を使用することもでき ますが、この場合、セマンティクスははるかに単純です。exec*()clone()fork()

于 2012-07-16T10:47:52.153 に答える