【问题标题】:exec function. Is there a way to back to the main program?执行功能。有没有办法回到主程序?
【发布时间】:2012-11-24 19:47:55
【问题描述】:

ubuntu 下的 exec() 函数有问题。 有没有可能回到主程序?

示例:

printf("Some instructions at beginning\n");
execlp("ls","ls", "-l", NULL);

// i want to continue this program after exec and see the text below
printf("Other instructions\n");

【问题讨论】:

    标签: c linux exec


    【解决方案1】:

    没有。成功的exec 调用用另一个程序替换当前程序。如果你想让父母和孩子都留下来,你需要在exec之前调用fork(2)

    pid_t childpid = fork();
    if(childpid < 0)
    {
        // Handle error
    }
    else if(childpid == 0)
    {
        // We are the child
        exec(...);
    }
    else
    {
        // We are the parent: interact with the child, wait for it, etc.
    }
    

    请注意,失败的 exec 调用(例如,给定的可执行文件不存在)确实会返回。如果exec返回,一定是报错,请做好处理错误的准备。

    【讨论】:

    • 如果我把他放在孩子中,exec 不会终止主程序吗?
    • @user1850043 是的。它将替换子进程的图像,保持父进程不变。
    【解决方案2】:

    exec 替换可执行文件映像。没有退路。一个不错的选择是vfork() execvfork 复制进程,继续复制,当它完成执行时,继续主进程。副本可以exec想要的文件。示例:

    printf("Some instructions at beginning\n");
    if(!vfork()){
        // child
        execlp("ls","ls", "-l", NULL); // child is replaced
    }
    // parent continues after child is gone
    printf("Other instructions\n");
    

    【讨论】:

      【解决方案3】:

      不,不可能使用 exec 系列函数,因为可执行文件是从您之前的代码生成的,即包含 execlp("ls","ls", "-l",NULL) 函数,由 execlp() 函数(即 >ls。 所以当这个函数成功执行后,你就不再有那个包含 execlp() 函数的旧可执行文件了。

      如果您想运行任何其他进程并想返回当前进程,请使用 system("ls -l"); 函数。

      【讨论】:

        【解决方案4】:

        没有。 exec 系列函数替换当前进程为新进程映像。如果您不想这样做,则需要在调用exec 之前先fork,这样您的进程的新分叉副本就会被替换(而不是原来的被替换)。

        【讨论】:

          【解决方案5】:

          exec 用新的进程映像替换当前进程映像,所以,,这是不可能的。

          如果您想恢复之前所做的事情,您可以执行 fork 并从子进程中调用 exec。

          if (fork() == 0){ //this part will only be executed by the child process
                  execlp("ls","ls", "-l", NULL);
                  wait((int*)0);
          }
          

          【讨论】:

            【解决方案6】:

            其实exec()或者它的函数族替换当前进程并执行

            所以尝试 fork 并在子进程中使用 exec(),然后在父进程中等待子进程终止。

            像这样:

            if(!fork())
             {
              // In child
              execlp("ls","ls","-l",NULL);
             }
             wait(NULL);
              // In parent 
             //rest of code
            

            【讨论】:

              猜你喜欢
              • 2022-07-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-08-12
              • 2020-03-23
              • 1970-01-01
              • 2021-09-03
              相关资源
              最近更新 更多