【问题标题】:C - execvp() interprocess communicationC - execvp() 进程间通信
【发布时间】:2013-02-15 16:32:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c pthreads fork ipc pipe


    【解决方案1】:

    您正在寻找的是 fork()、exec 函数之一和 pipe()(或者可能是 socketpair() 或其他东西,但管道也可以工作)的组合。

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

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

    记得wait()让孩子结束。

    【讨论】:

    • 啊,谢谢。那么 execvp() 究竟是如何工作的。如果孩子调用 execvp() 它将成为 execvp() 调用的程序,还是会产生另一个单独运行 execvp 的线程并等待 execvp 完成然后加入。不确定这是否有意义,或者在这种情况下是否重要,我只是好奇
    • 当一个进程调用任何exec 函数时,该进程本身就成为被调用的程序。这就是为什么它很少从父进程调用。所以是的,就像你描述的第一种情况(“如果孩子调用 execvp() 它将成为 execvp() 调用的程序”)。
    • 另外,您可以转到 shell 并键入 man 3 exec 以获取更多信息。或在这里查看:linuxmanpages.com/man3/exec.3.php
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多