2017-01-03 15 views
2

共有メモリのブロックを使用して互いに通信する2つのプログラムがあります。共有メモリを持つ2D配列

最初のプログラムはコマンドラインから引数をとり、指定された回数だけforkし、各子のプロセスIDとランダムに生成された数値が2番目のプログラムに渡されるはずの2次元配列に格納されます添付のメモリブロックを介して。問題はどのようにこれを行うにはわからないと私はこれになると少し初心者ですので、いくつかの助けを感謝します。ここで

は、最初のプログラムのためのコードは、これまでのところで、完全にテストされ、作業されています

コードの巨大な壁のため申し訳ありません
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("\nError with command line argument!\n"); 
     exit(1); 
    } 

    /* Program is simulation of a printer queue, forked child processes 
     act as jobs in the queue with pids being the job number and a 
     randomly generated value being the priority order (this comes into 
     play in program 2) */ 

    srand(time(null)); 
    pid_t pid; 

    int amount, i, pID, rNum; 

    amount = atoi(argv[1]); 

    int procID[amount]; /* 1D array that will hold pid for each process */ 
    int randNum[amount]; /* 1D array that will hold random number to 
          determine priority level of the print jobs */ 

    int rows = amount; 
    int cols = 2; 

    int printDetails[rows][cols]; /* 2D array that will hold the values 
            from both 1D arrays, displaying all 
            data from print queue when output */ 

    printf("\nPrint queue started:"); 
    getchar(); 

    for (i = 0; i < amount; i++) 
    { 
     pid = fork(); 

     if (pid < 0) 
     { 
      perror("Error with fork!"); 
      exit(1); 
     } 

     if (pid == 0) 
     { 
      pID = getpid(); 
      rNum = rand()%50; 

      printf("\nPrint Job : %d", pID); 
      printf("\nPriority Level : %d\n", rNum); 

      procID[i] = pID; 
      randNum[i] = rNum; 

      sleep(1); 
     } 

     else 
     { 
      wait(NULL); 
      return 0; 
     } 
    } 

    printf("\n%d successful print jobs created\n", amount); 

    printf("\n-----PRINT DETAILS-----\n"); 
    printf("\nJob No:\tPriority:\n"); 

    for (i = 0; i < rows; i++) 
    { 
     printDetails[i][0] = procID[i]; 
     printDetails[i][1] = randNum[i]; 

     printf("%d\t%d\n", printDetails[i][0], printDetails[i][1]; 
    } 

    printf("\n-----END OF LIST-----\n"); 

    /* Create shared memory segment using shmget and shmat, 
     how do I insert the array above into this, like I said 
     complete noob! */ 

} 

、ちょうど私が働いているかを理解を助けるために、私のような 私はちょっとここの深さから離れているので、共有メモリに関するどんな助けも大いに評価されるでしょう!

+0

最初に共有メモリのブロックを作成し、それをあなたの配列として使用することを検討してください。多分、キャストがそれを明らかにするのに役立つでしょう。 – user133831

答えて

1

コピーオン書き込みメカニズムは、2番目のプロセスで変更した瞬間に新しいポインタを割り当てます...そして、それが死ぬと、別のデータを持つ新しい割り当てられたメモリを取ります...ソリューションは動的ポインタ...値を変更すると、新しい値を動的に割り当てずに古いものを使用してデータを変更しません。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("\nError with command line argument!\n"); 
     exit(1); 
    } 

    /* Program is simulation of a printer queue, forked child processes 
     act as jobs in the queue with pids being the job number and a 
     randomly generated value being the priority order (this comes into 
     play in program 2) */ 

    srand(time(NULL)); // null -> NULL 
    pid_t pid; 

    int amount, i, pID, rNum; 

    amount = atoi(argv[1]); 

    int* procID =(int*) calloc(amount,sizeof(int)); /* 1D array that will hold pid for each process */ 
    if(!procID) 
    return -1; 
    int* randNum =(int*) calloc (amount,sizeof(int)); /* 1D array that will hold random number to 
          determine priority level of the print jobs */ 
    if(!randNum) 
    return -1; 
    int rows = amount; 
    int cols = 2; 
    int k; 
    int** printDetails = (int**) calloc (rows, sizeof(int*)); /* 2D array that will hold the values 
            from both 1D arrays, displaying all 
            data from print queue when output */ 
    if(!printDetails) 
    return -1; 
    for(k=0; k<rows;k++) 
    { 
     printDetails[k] = (int*) calloc (cols, sizeof(int)); 
     if(!printDetails[k]) 
     return -1; 
    } 
    printf("\nPrint queue started:"); 
    getchar(); 

    for (i = 0; i < amount; i++) 
    { 
     pid = fork(); 

     if (pid < 0) 
     { 
      perror("Error with fork!"); 
      exit(1); 
     } 

     if (pid == 0) 
     { 
      pID = getpid(); 
      rNum = rand()%50; 

      printf("\nPrint Job : %d", pID); 
      printf("\nPriority Level : %d\n", rNum); 

      procID[i] = pID; 
      randNum[i] = rNum; 

      sleep(1); 
     } 

     else 
     { 
      wait(NULL); 
      return 0; 
     } 
    } 

    printf("\n%d successful print jobs created\n", amount); 

    printf("\n-----PRINT DETAILS-----\n"); 
    printf("\nJob No:\tPriority:\n"); 

    for (i = 0; i < rows; i++) 
    { 
     printDetails[i][0] = procID[i]; 
     printDetails[i][1] = randNum[i]; 

     printf("%d\t%d\n", printDetails[i][0], printDetails[i][1]); 
    } 

    printf("\n-----END OF LIST-----\n"); 

    /* Create shared memory segment using shmget and shmat, 
     how do I insert the array above into this, like I said 
     complete noob! */ 
    for(k=0; k<rows; k++) 
     free(printDetails[k]); 
    free(printDetails); 
    free(randNum); 
    free(procID); 
}