【问题标题】:Pass File Descriptor - Execve (typecast)传递文件描述符 - Execve(类型转换)
【发布时间】:2011-09-12 03:52:05
【问题描述】:

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

到目前为止我做了什么:

父母使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 的程序的工作版本,但我实际上必须将管道描述符传递给孩子按照项目的说明。

感谢任何帮助。

【问题讨论】:

    标签: c casting file-descriptor execve


    【解决方案1】:

    简单地将文件描述符转换为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);
    

    【讨论】:

    • 非常感谢。我仍在努力思考该交易中真正发生的事情(类型转换让我有点困惑),但你的帖子非常清楚,我想我明白了。
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多