[英]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
重定向到孩子們的stdin
和stdout
,但是我必須按照項目的指示將管道描述符傳遞給子節點。
任何幫助表示贊賞。
簡單地將文件描述符轉換為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.