2016-02-04 66 views
0

我創建了一個c程序,它可以在單個進程中完成所有任務。例如,它依次按文件讀取文件,並輸出一些內容。我不得不使用一個稱爲向量的巨大數組,因此我聲明它是靜態的(因爲它給了我一個seg錯誤)。靜態雙向量[100000] [10000]。C併發進程和靜態變量

現在我需要使用多個併發進程創建前一個程序的相同輸出。

我有什麼至今:

pid_t pids[argc - 1]; 
int pid; 
for (e=1; e < argc; e++) 
{ 
    pid = fork(); 
    if (pid < 0) 
    { 
      //error 
    } 
    else if (pid > 0) 
    { 
      pids[e-1] = pid 
    } 
    else 
    { 
      printf("The child process of %d is started\n", pids[e-1]); 
      printf("The child process of %d is finished\n", pids[e-1]); 
    } 
} 

for (int i = 0 ; i < argc - 1 ; i++) 
{ 
int status; 
waitpid(pids[i], &status, 0); 
printf("Process %d is finished\n", pids[i]); 
} 

現在,我只是想看看孩子的輸出處理交織,這意味着它們將同時運行。

到目前爲止,當我運行上述操作時,我收到了「Killed」消息,但是一旦我註釋掉靜態向量數組,它就會正常運行。這是爲什麼?

它運行時的輸出真的很奇怪,基本上我有0的pids元素。

任何幫助將不勝感激。謝謝。

+0

因爲你調用fork,孩子的和麪值恩有獨立的記憶。現在有幾個靜態雙向量(每個進程1個)。你不會有併發症。您應該使用線程,因爲它們共享相同的內存。 –

+0

我必須使用進程,而不是線程。 –

+0

http://stackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork。你必須使用shm函數來共享內存。 –

回答

1

您的進程被OOM-Killer(內存不足)殺死。

static double vectors[100000][10000]需要大約100000 * 10000 * 8個字節的內存,這使得大約8GB。直到寫入內容(內存過度分配)纔會物理分配此內存。如果你fork() n次並在每個進程中寫入這些頁面,我認爲所需的內存大約是n * 8GB,這很快超過了你的物理內存+ swap。 dmesg應該向您顯示關於此的消息。

一種解決方案是,之前fork() ING創建mmap()共享地圖,讓所有進程在同一個陣列上運行(如果這是你所需要的):

double *vectors = mmap(NULL, 10000*100000*sizeof(double), 
         PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

,取而代之的

vectors[a][b] 

訪問

vectors[a*10000+b] 
+0

或者使用'clone'與'CLONE_VM',或使用pthreads。 – immibis

+0

@immibis是的,但OP在評論中表示他必須使用流程,而不是線程......無論如何...... – Ctx

+0

@Ctx,謝謝。是的,我需要使用進程,而不是線程。我基本上每個文件需要一個獨立的進程,並且輸出需要與我原始程序的輸出相匹配。 –