2014-02-16 63 views
-1

我被賦予分叉n個進程的任務。進程運行xterm的實例時出現叉錯誤

對於每個過程中,它必須啓動/斌/ xterm的

我正在與產生n個處理和打開的xterm實例的部分完成的一個實例。

當我試着運行程序時,我得到了這個輸出。 (錯誤以粗體顯示)

Number of process to open is 1.

Child (1): 3457

/bin/xterm: Xt error: Can't open display:

/bin/xterm: DISPLAY is not set

我的代碼如下。

我試着googleing的錯誤,但到目前爲止我還沒有運氣。

任何解決方案?

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

int main(int argc, char *argv[]) 
{ 
    int num = atoi(argv[1]); 
    printf("Number of process to open is %d.\n", num); 
    int pid; 
    int i; 

    for(i = 0; i < num; i++) 
    { 
     pid = fork(); 
     if(pid < 0) { 
      printf("Error"); 
      exit(1); 
     } else if (pid == 0) { 
      printf("Child (%d): %d\n", i + 1, getpid()); 
      char * const argv[] = {"/bin/xterm", NULL}; 
      char * const envp[] = {NULL}; 
      int rc = execve ("/bin/xterm", argv, envp); 
      exit(0); 
     } else { 
      wait(NULL); 
     } 
    } 
    return 0; 
} 
+0

你unecessrily等待每個孩子終止! – Nullpointer

+0

爲什麼要在argv []的值不變的時候賦值? – enedil

+0

@Nullpointer謝謝你的提示。我會刪除wait(NULL).. :) –

回答

0

這一點改變了代碼工作完全正常我的系統上:

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

int main(int argc, char *argv[]) 
{ 
    int num = atoi(argv[1]); 
    printf("Number of process to open is %d.\n", num); 
    int pid; 
    int i; 

    for(i = 0; i < num; i++) 
    { 
     pid = fork(); 
     if(pid < 0) { 
      printf("Error"); 
      exit(1); 
     } else if (pid == 0) { 
     //printf("Child (%d): %d\n", i + 1, getpid()); 
      //char * const argv[] = {"/bin/xterm", NULL}; 
      //char * const envp[] = {NULL}; 
      execl("/usr/bin/xterm", "/usr/bin/xterm", NULL); 
      //exit(0); 
     }else { 
      wait(NULL); 
     } 
    } 
    return 0; 
} 
+0

謝謝!它爲我工作。 :) –

+0

順便說一下,它可以用execve做到這一點? –

+0

是的,這是可能的! – Nullpointer

0

錯誤輸出解釋您粘貼:

/bin/xterm: DISPLAY is not set 

您需要設置DISPLAY適當。否則,它將無法知道在哪裏放置其顯示。

另外,您是否真的想爲wait創建後爲每個孩子?

+0

只是好奇,我該如何正確設置DISPLAY? –

+0

這取決於您想要顯示的位置。您需要將其設置爲您希望'xterm'輸出到的顯示器的名稱/位置。使用'setenv'。 –