0

コマンドを介してファイル記述子を渡し、execve()反対側でファイル記述子にアクセスするにはどうすればよいのでしょうか。ファイル記述子をリダイレクトするために使用できることは知っていdup2ますが、それはできません。実際にファイル記述子を子に渡して、子で使用する必要があります。

私がこれまでにしたこと:

親はpipe次のような+引数を作成します。

int pfd[2];
if(pipe(pfd) == -1)
    exitWithError("PIPE FAILED", 1);
char *args_1[] = {"reader", argv[1], (char*) pfd, (char *) 0};

次に、子供はexecvefork()のように電話をかけます。

close(pfd[1]);
execve("./reader", args_1, NULL);

次に、リーダープログラムで、渡されたパイプ記述子にアクセスしようとします。

int main(int argc, char* argv[]){
    ...
    write(argv[2][1], buf, read_test);

argv[2]パイプ記述子を参照している必要があり、次にパイプargv[1]の書き込み端に移動する必要があります。ここで型キャストを別の方法で行う必要があることはほぼ間違いありませんが、私が試したすべてがうまくいくわけではありません。

:このプログラムの作業バージョンを使用dup2して、子にリダイレクトしstdinたりstdout、子にリダイレクトしたりしていますが、プロジェクトの指示に従って、実際にパイプ記述子を子に渡す必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

2

単にファイル記述子をにキャストするのchar*は良い考えではありません。OSが文字列のコピーを選択して0バイトで停止すると、データが失われる可能性があるため、データが完全にコピーされるわけではありません。ファイル記述子を含む文字列を作成する方が安全です。

int pfd[2];
if(pipe(pfd) == -1)
    exitWithError("PIPE FAILED", 1);
char string1[12]; // A 32 bit number can't take more than 11 characters, + a terminating 0
snprintf(string1,12,"%i",pfd[1]); // Copy the file descriptor into a string
char *args_1[] = {"reader", argv[1], &string1[0], (char *) 0};

次に、リーダープログラムはこれを使用atoiしてこれをintに変換し直します。

int fd = atoi(argv[2]);
write(fd,buf,read_test);

本当にキャストを使用したい場合は、リーダーのargv[2]ようにキャストする必要があります。int*

write(((int*)argv[2])[1],buf,read_test);
于 2011-09-12T04:15:19.840 に答える