2015-10-19 78 views
0

我觉得我是在一个很好的方法,到目前为止用C异步运行外部程序。在该代码中,我希望它其中条件导致AFLAG被设置为1或2。然后基于该号码,相应的程序将被启动。因此,如果AFLAG为1,则需要/path/to/app1在后台启动,并将该软件需要继续。如果aflag是2则需要启动/path/to/app2根据病情

我可以确定过程是否是fork()的孩子,但我不想在主函数中执行fork(),因为我不想在启动程序之前执行后台进程。

如果可能的话,我还想避免使用pthread和系统函数,因为我在寻找资源密集度最低的答案,并且人们说fork() + exec()是要走的路。

如何确定是否在主要过程是一个孩子?我希望它能够知道要运行的程序。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

    static char *app1="/path/to/app1"; 
    static char *app2="/path/to/app2"; 
    static char *app; 

    int otherfunction(){ 
     int aflag=0; 
     //do something (will fill in later) 
     if (aflag==1){ 
     //run app 1 
     app=app1; 
     fork(); 
     } 
     if (aflag==2){ 
     //run app 2 
     app=app2; 
     fork(); 
     } 

    } 

int main(){ 
     int imachild=???; 
     if (imachild==1){ 
     execl(app,NULL); 
     return 0; 
     } 
     while(1){ 
     otherfunction(); 
     } 
    } 
+1

“我不希望在我的主函数来执行fork()的,因为我不希望之前,它是时间来启动程序执行的后台进程。”。很好,当你想启动程序时调用'fork'。然后根据返回值调用'execl'(child)或不调用'execl'(parent)。 – kaylum

+0

所以我实际上可以将fork的返回值用于孩子吗?怎么样?我想'fork()的'启动子,并开始在我的计划执行'主()'函数的副本,它返回一个值之前。 – Mike

+0

@Mike,'fork'滋生关闭其中*继续下一条语句*一个孩子。它不在'main'中开始。不同之处在于'fork'在孩子中返回零,或者孩子在父代中的PID(或者错误中为负值) –

回答

0

希望下面的代码会给你一些想法。显然,这只是一个带有infinete循环的示例代码。实际代码可能会让父级接受输入来设置值aflag。但它说明了父线程如何分离新进程以及新子进程如何决定运行哪个应用程序。父流程返回到下一个fork操作。

static char *app1="/path/to/app1"; 
static char *app2="/path/to/app2"; 

int main(void) 
{ 
    pid_t pid; 
    int aflag = SOME_VALUE_OBTAINED_FROM_SOMEWHERE; 
    const char *app = NULL; 

    while (1) { 
     pid = fork(); 
     if (pid == -1) { 
      printf("fork error\n"); 
     } else if (pid > 0) { 
      /* This is child code. */ 
      switch (aflag) { 
      case 0: 
       app = app1;   
       break; 
      case 1: 
       app = app2; 
       break; 
      } 
      if (app) { 
       execl(app, NULL); 
       /* execl does not return on success */ 
       printf("execl error\n"); 
      } 
     } else { 
      /* 
      * This is the parent code - no exec. Just do 
      * something else. 
      */ 
     } 
    } 

}

+0

我试图从'main()'外面调用'fork()'。就像我说的。除非我准备好执行外部程序,否则我不希望分叉发生。 – Mike

+0

无论是主体还是内部都没关系。这与实际运行时行为无关。这就是你如何构建你的代码。上述代码中的“else”条件(或实际上在fork之前)是您通常会阻止并等待导致父代唤醒的事件,设置aflag并执行fork的地方。 – kaylum

+0

您似乎很困惑,认为只是因为您将代码放入函数中,并从'main'调用该函数,该函数在调用'fork'时以某种方式更改。它不是。它只是改变你的程序结构(这是一件好事)。 – kaylum