传递文件描述符 – 执行(类型转换)
我想知道如何通过execve命令传递文件描述符,然后在另一端访问它。 我知道我可以使用dup2重定向文件描述符,但我不能这样做。 我需要实际将文件描述符传递给子进程并在子进程中使用它。
到目前为止我所拥有的:
Parent使管道+ 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重定向到孩子的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);