【问题标题】:Best Way to Split Server Process拆分服务器进程的最佳方法
【发布时间】:2020-12-01 21:19:08
【问题描述】:

我正在用 C 语言构建一个服务器,它不仅可以监听传入的连接,还可以为我提供一个交互式 shell。基本上,我有这样的东西来接受客户......

while (1) {
    accept_client(serverfd);
}

还有这样的东西用于创建交互式外壳

while (1) {
    printf("shell> ");
    fgets(command, sizeof(command) - 1, stdin);
    server_do(command);
}

我想并行运行两个循环,交互式 shell 可以实时访问来自服务器的变量。我尝试使用fork,效果很好,但总体而言并不成功,因为 fork 只会创建子进程的副本,并且当新连接发生时,任何变量都无法更新。我还尝试使用pipe 来传输数据——但这有点像一场灾难(尽管我可能做错了)。最后我尝试使用pthread,但没有看到任何明显的方法可以使两者并行运行而不会阻塞。

执行此操作的“正确”方法是什么?我做了相当多的研究,并没有偶然发现一个明显的答案。

【问题讨论】:

  • 与计算中的许多事情一样,没有单一的“正确”方式,因此您的问题不是很容易回答。使用线程当然是一种的方法。如果您需要特定解决方案的帮助,请将该代码显示为 minimal verifiable example 并说明您遇到的问题。否则,您目前所说的问题对于 Stack Overflow 来说太宽泛了。

标签: c multithreading sockets pipe fork


【解决方案1】:

您也可以将“stdin”视为“网络连接”,它们在低级视图中都是“fd”。

所以你需要实现一个并行处理多个连接的服务器, 有很多方法可以做到这一点。

这是解释和比较这些方法的好读物 (http://www.wangafu.net/~nickm/libevent-book/01_intro.html)。

我想在你的情况下以异步方式实现。 我编写了一些包装器和示例 (https://github.com/grizzlybears/tevpp) 以使 libevent 更易于使用。 'cat' 示例演示了像普通连接一样处理 stdio。你可能有兴趣。:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 2020-04-26
    • 2017-01-30
    • 1970-01-01
    • 2018-03-24
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多