【问题标题】:Passing a struct as a command-line argument to a process using execl() function call in C在 C 中使用 execl() 函数调用将结构作为命令行参数传递给进程
【发布时间】:2012-08-16 12:05:50
【问题描述】:

我正在尝试将 SSL 功能添加到我现有的 TCP 回显客户端-服务器应用程序中。

之前在我的简单服务器中,我为每个传入的客户端连接生成了一个新子节点。对于这个孩子,我将 conn-fd (char*) 作为命令行参数传递。 (如下图)

execl("./simple_server_instance", conn_fd, NULL);

现在,对于我的安全服务器,我需要传递一个 CYASSL 对象(一个有效的结构)而不是 conn_fd。 (如下图)

ssl = CyaSSL_new(ctx);
CyaSSL_set_fd(ssl, connfd);

这里的'ssl'是需要传递给子进程的对象。我尝试了以下方法来实现它,但没有成功。有没有简单的替代方案,还是我应该采用序列化方式?

  1. 将 ssl 对象类型转换为 char*

  2. 创建一个缓冲区并对整个结构进行 memcpy。 (如下图)

unsigned char sslobjbuf[sizeof(ssl)];
memcpy(&sslobjbuf, ssl, sizeof(ssl));
execl("./secure_server_instance", "hello", "25", sslobjbuf, NULL );

sdsd

【问题讨论】:

    标签: command-line struct arguments


    【解决方案1】:

    当你execl()一个进程时,你完全用执行的进程替换了正在运行的进程。 exec 系列函数需要一系列以空字符结尾的字符串,这些字符串将在生成的应用程序中以arvg[] 的形式出现。您不能只通过此接口传递任意对象。

    当您可能想要使用 fork 系统调用时,它会为您提供一个与父进程共享其代码/数据的新子进程。 ./simple_server_instance 的代码将与主服务器代码合并。您可以在父进程中调用ssl = CyaSSL_new(ctx); 来获取您需要的对象,然后调用fork。然后,父级可以在子级运行ssl 对象时继续处理新请求。

    这样的控制流程可能会起作用:

    while (1) {
        wait_connection();
        pid_t child_pid = -1;
        ssl = CyaSSL_new(ctx);
        child_pid = fork();
        if (child_pid == 0) {
            /* We're now running the child process which also has access to ssl.
             * Run simple_server_instance handler code
             */
        }
        else {
            /* Code running in parent.  Do housekeeping, save child_pid if necessary.
             * clean up ssl, object, get ready for next connection, handle finished
             * child processes.
             */
        }
    }
    

    【讨论】:

    • 飞利浦。你所建议的是我已经在做的事情。在孩子中,我正在调用 exec() 系统调用来调用新的二进制文件。这个新进程是我需要传递 ssl 对象的进程。
    • 无论 exec() 出现在父级还是子级中都无关紧要 - 无论何时调用它,整个进程都将替换为 exec'ed 二进制文件。将服务器和 simple_server_instance 的源代码编译成一个二进制文件。 fork 和 exec 的常用方法是打开一组管道用于父子之间的通信。子进程从父进程继承管道句柄,然后可以使用这些句柄进行通信。见en.wikipedia.org/wiki/Fork-exec
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2018-09-17
    • 2012-08-13
    • 2013-12-23
    相关资源
    最近更新 更多