1

大家好,我是 C 的新手,如果我很迷茫,我很抱歉。我在尝试创建这个多线程 Web 服务器时遇到问题。我正在尝试...

  • 有一个线程创建一个新线程
  • 让该新线程执行 execvp() 以在我的机器上调用不同的 C 程序
  • 让该新线程从 execvp() 返回数据流

我正在考虑使用 pthreads 生成一个新进程来运行 execvp() 并让它通过管道返回数据。但这甚至有必要吗?pthreads不共享内存吗?

另外,我可能正在考虑使用 fork() 而不是 pthread 并让子级通过管道将数据发送回父级。

你能帮我指引正确的方向吗?

4

2 回答 2

3

您正在寻找的是功能fork()之一execpipe()(或可能socketpair()或其他东西,但管道也可以)的组合。

线程共享内存,但execvp()会创建一个全新的进程来替换调用者进程——即使这个进程与其父进程共享内存(我不确定它是否这样做!),新运行的程序也不知道如何使用那个记忆。

正确的方法是当你还有一个进程时打开管道,fork()分成两个进程(父进程和子进程),让子进程调用execvp(). 孩子现在可以写入管道的一端,而父母可以从另一端读取。

记住要wait()为孩子结束。

于 2013-03-01T08:16:34.993 回答
1

你写过你的非阻塞单线程网络服务器吗?如果您没有可比较的东西,您将如何衡量多线程的好处?如果您将单线程项目暴露给并发,那么确定最佳性能提升的位置要容易得多,而不是在项目的余生中猜测并忍受糟糕的框架。

创建线程很容易,但您确实需要先阅读pthread_create 手册。您还能如何相信您的项目正在正确处理错误?我还建议阅读其他 pthread 功能。顺便说一句,如果您向我表明您正在尝试自己解决问题,我很乐意帮助您解决问题。我不会费心用勺子喂你。

正如 aaaaaa123456789 所述,您不希望使用 pthread_create/execvp 生成,因为这会用新进程替换整个程序环境(包括所有线程)。

于 2013-03-01T08:30:42.093 回答