2011-09-12 25 views
0

私はexecveコマンドでファイル記述子を渡してから、それを他の側にアクセスする方法を知りたいと思います。私はファイル記述子をリダイレクトするためにdup2を使うことができますが、私はそれを行うことはできません。実際にファイル記述子を子に渡し、子で使用する必要があります。ファイルの記述子を渡す - Execve(タイプキャスト)

親がパイプ+そうのような引数を行います:

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

その後、子供がそうのようにフォークの後はexecveを呼び出します。で、その後

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

私がこれまで持って何

私が渡されたパイプ記述子にアクセスしようとしました:

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

^^ argv [2]はパイプ記述子を参照する必要があり、[1]はパイプの書き込み終了に進む必要があります。私はここでいくつかタイプキャスティングを行う必要があるということはほぼ肯定的ですが、私が試したことはすべてうまくいかないのです。

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

何か助けていただければ幸いです。

答えて

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); 

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

write(((int*)argv[2])[1],buf,read_test); 
+0

ありがとうございました。私はまだその取引で実際に何が起こったかを頭に入れようとしています(タイプキャスティングは少し混乱させますが)あなたの投稿は非常に明確で、私は理解していると思います。 – forTruce

関連する問題