2015-10-19 72 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