0

Linux では次のようなコードがあります。

return_code= spawnp(cmd, 3, fd_map, NULL, argv, environ);

これを QNX から Linux に変換する必要があります。Linux では spawn を使用できないため、fork-exec を使用する必要があります。1) どうすればそれができますか? これは正しいですか ?

pid = fork();
if (pid ==0) /* child */
    exec(cmd, argv, environ);

2) spawn で渡されるパラメーター fd_map と "3" を exec に渡すにはどうすればよいですか?

4

2 に答える 2

1

「3」の意味がわかりません。

子プロセスで利用可能なファイル記述子を変更したい場合は、execまたはの呼び出しでこれを行うのではなく、 、 などforkを呼び出して間で行います。基本的に関数がこれを行い、Linux/glibc では、andを使用して実装されています(ソースコードを読むことができます...)closedup2posix_spawnforkexec

pid = fork();
if (!pid) {
    // close, dup2 go here
    exec(...);
    // error
}
于 2011-07-05T23:57:18.673 に答える
0

3 は、fd_map に渡すファイル記述子の数を示し、spawnp() 呼び出しでは、子プロセスに渡したいファイル記述子のみを便利に選択できます。

したがって、 fork() を呼び出した後、子プロセスにすべてのファイル記述子があるため、興味のないファイル記述子を閉じることができます。次に、ファイル記述子が CLOEXEC としてマークされていないと仮定します (閉じるexec) それらは exec() されたコードにも引き継がれます。

ただし、アプリケーションがマルチスレッドの場合、fork() は失敗することに注意してください。最近のバージョンまで、QNX はスレッド化されたプロセスのフォークをサポートしていないためです。

于 2011-10-12T12:20:07.670 に答える