【问题标题】:execvp and fork not working as expectedexecvp 和 fork 没有按预期工作
【发布时间】:2014-08-02 07:41:11
【问题描述】:

我有以下代码:

for (loop=0;loop<2;loop++) 
    {
        child_pid = fork();

        if (child_pid == 0)
        {
            rc = execvp ("/usr/local/some_program", arguments);
        }
    }

我根据循环的值更改传递给 /usr/local/some_program 的参数。我希望 some_program 并行执行两个实例。但是我看到我首先执行了 some_program 一次,并且只有在它完成之后我才能执行 some_program 的第二个实例。

我无法让它们并行且独立地运行。

我应该使用 pthreads 而不是 fork?

我尝试执行的 some_program 与父进程完全无关。

谢谢

【问题讨论】:

  • 你到底看到了什么?如果将程序替换为运行程序并在前后打印调试消息的 shell 脚本会发生什么?
  • 调试:在调用fork()之后直接添加perror("fork()");
  • 无法知道父级及其子级何时或以何种顺序运行。除非孩子们正在做大量工作或正在等待外部事件,否则可能只是第一个孩子在父母开始第二个孩子之前完成。
  • 我现在意识到从新线程调用 execvp 是没有意义的—— exec 系列中的所有函数都会销毁当前进程中的所有线程,并用正在执行的进程替换整个进程。因此,如果我想使用 execvp,那么我必须使用 fork。我希望我是对的。

标签: c pthreads fork execvp


【解决方案1】:

“我无法让它们并行且独立地运行。” - 不。两个过程将并行执行。检查创建两个这样的程序-

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
   printf("Pid= %d\n", getpid());
   while(1);
}

编译这两个程序并制作两个可执行文件。通过命令行参数将这两个 exe 文件名传递给主程序并使用系统命令运行它。但是你的主程序应该是实时的。

for (loop=0;loop<2;loop++) 
{
    child_pid = fork();

    if (child_pid == 0)
    {
       system(argv[loop+1]);
       exit(0); // if you don't use exit your second exe file will be executed twice.
    }
}
while(1);

现在在终端输入ps 命令并找到TTY 名称并运行主程序。打开一个新终端并输入

ps -e  | grep pts/X    // pts/X is main program running terminal name. it may pts/0 or pts/1 ...

通过这个你可以知道这两个进程是否并行运行。

【讨论】:

  • 谢谢,我验证并确保两个分叉程序并行运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2013-07-07
  • 2012-12-05
  • 2017-05-22
  • 2019-07-28
  • 2014-05-24
相关资源
最近更新 更多