使用 C 中的 execl() 函数调用将结构作为命令行参数传递给进程



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

在我的简单服务器中,我为每个传入的客户端连接生成一个新子节点。对于这个孩子,我将 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 对象类型转换为字符*

  2. 创建一个缓冲区并对整个结构进行记忆。(如下所示)

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

SDSD

execl()进程时,将正在运行的进程完全替换为执行的进程。 exec 系列函数需要一系列以 null 结尾的字符串,这些字符串将在生成的应用程序中作为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.
         */
    }
}

最新更新