0

我想知道如何通过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};

execve然后孩子fork()像下面这样调用:

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

任何帮助表示赞赏。

4

1 回答 1

2

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