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

时间:2012-08-16 12:05:51

标签: command-line struct arguments

我正在尝试将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对象类型化为char *

  2. 创建缓冲区并对整个结构执行memcpy。 (如下所示)

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

    sdsd

1 个答案:

答案 0 :(得分:1)

当您execl()进程时,您将使用exec'ed进程完全替换正在运行的进程。 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.
         */
    }
}