2011-09-12 41 views
0

我想知道如何通過execve命令傳遞文件描述符,然後在另一側訪問它。我知道我可以使用dup2重定向文件描述符,但我不能那樣做。我需要將文件描述符實際傳遞給孩子並在孩子中使用它。通過文件描述符 - Execve(typecast)

我到目前爲止有:

家長讓管+ ARGS像這樣:

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重定向到標準輸入和標準輸出的孩子,但我必須實際上傳遞管道描述符到一個孩子按照項目的說明。

任何幫助表示讚賞。

回答

2

簡單地將文件描述符轉換爲char*不是一個好主意。如果操作系統選擇複製字符串並在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); 
+0

非常感謝。我仍然試圖圍繞在這個交易中真正發生的事情(類型轉換使我有點困惑),但是你的帖子非常清晰,我想我明白了。 – forTruce