传递文件描述符-Execve(类型转换)

传递文件描述符-Execve(类型转换),c,casting,file-descriptor,execve,C,Casting,File Descriptor,Execve,我想知道如何通过execve()命令传递文件描述符,然后在另一端访问它。我知道我可以使用dup2重定向文件描述符,但我不能这样做。我需要实际地将文件描述符传递给子级,并在子级中使用它 到目前为止我所做的: 父对象使管道+参数如下所示: int pfd[2]; if(pipe(pfd) == -1) exitWithError("PIPE FAILED", 1); char *args_1[] = {"reader", argv[1], (char*) pfd, (char *) 0};

我想知道如何通过
execve()
命令传递文件描述符,然后在另一端访问它。我知道我可以使用
dup2
重定向文件描述符,但我不能这样做。我需要实际地将文件描述符传递给子级,并在子级中使用它

到目前为止我所做的:

父对象使管道+参数如下所示:

int pfd[2];
if(pipe(pfd) == -1)
    exitWithError("PIPE FAILED", 1);
char *args_1[] = {"reader", argv[1], (char*) pfd, (char *) 0};
close(pfd[1]);
execve("./reader", args_1, NULL);
然后子对象在
fork()
之后调用
execve
,如下所示:

int pfd[2];
if(pipe(pfd) == -1)
    exitWithError("PIPE FAILED", 1);
char *args_1[] = {"reader", argv[1], (char*) pfd, (char *) 0};
close(pfd[1]);
execve("./reader", args_1, NULL);
然后,在reader程序中,我尝试访问传递的管道描述符:

int main(int argc, char* argv[]){
    ...
    write(argv[2][1], buf, read_test);
argv[2]
应该引用管道描述符,然后
argv[1]
应该转到管道的写入端。我几乎可以肯定,我需要在这里做一些不同的类型铸造,但我尝试的每件事都不太奏效

注意:我有一个工作版本的程序,使用
dup2
重定向到子程序的
stdin
stdout
,但我必须按照项目说明将管道描述符实际传递给子程序


非常感谢您的帮助。

简单地将文件描述符转换为
字符*
不是一个好主意。如果操作系统选择复制字符串并在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);

非常感谢你。我仍在试图弄清楚那笔交易中到底发生了什么(类型转换让我有点困惑),但你的帖子非常清楚,我想我明白了。