簡體   English   中英

傳遞文件描述符 - 執行(類型轉換)

[英]Pass File Descriptor - Execve (typecast)

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

到目前為止我做了什么:

Parent生成pipe + args,如下所示:

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

然后孩子在fork()之后調用execve ,如下所示:

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重定向到孩子們的stdinstdout ,但是我必須按照項目的指示將管道描述符傳遞給子節點。

任何幫助表示贊賞。

簡單地將文件描述符轉換為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM