将一组结构放入unix中的共享内存中,以便客户端程序可以访问它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将一组结构放入unix中的共享内存中,以便客户端程序可以访问它相关的知识,希望对你有一定的参考价值。

所以我现在正在尝试使用共享内存和fork()函数在unix中编码,我有一个包含10个结构的数组,我想将该数组放入共享内存中,以便客户端程序可以访问它。我希望有人能指出我如何做到这一点的正确方向。

我目前的代码是:

//  Compiler Directives


//  Standard Library Inclusions
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <time.h>
//Other Inclusions

struct strProcess 
{
  int nPriority;
  int nPid;
};
//  Function Prototypes (if not included within a header file)
int frand (int nInput);
int finval (int nInput);
void fsortasc(struct strProcess pArray[],int nInput);
//  Main
int main(void)
{
// Variable Declarations
int     nShmid,i,arraySize,nRpriority,j, nInput;
key_t   nKey;
char    *ptrshm, *ptrs;
int     nSize;
pid_t   pid; 
struct  strProcess pArray[10];
struct  strProcess *Array;

Array = pArray;
// Code start

nKey = 5678;
FILE *f = fopen("logfile.txt", "w");

if (f == NULL)
{
      printf("Error opening file!
");
      exit(1);
}

printf("please enter the amount of processes to create for this cycle between 1 and 10 
");
scanf("%d",&nInput);
if (nInput <= 0 || nInput > 10)
{
  nInput = finval(nInput);
}
printf("%d", nInput);

nSize = sizeof(pArray) * 10;
 //create segment
if ((nShmid = shmget(nKey,nSize, IPC_CREAT | 0666)) <0)
{
      perror("shmget");
      exit(1);
}
printf("segment created 

");
fprintf(f, "shared memory segment created");

Array *pArray = shmat(shmid,NULL, 0);
if (Array* pArray (-1)) 
{
      perror("shmat");
      exit(1);
}
printf("segment attached 

");
fprintf(f, "shared memory segment attached");

for(i = 0 ; i < nInput; i++)
{
    if ((pid = fork()) < 0)
    {
      perror("fork");
      exit(1);
    }
    if (pid == 0)
    {
      Array[i].nPid = getpid();
      nRpriority = frand(nInput);
      Array[i].nPriority = nRpriority;
      printf("print job created with Pid %d and priority number %d", 
      getpid(), nRpriority);
      fprintf(f, "print job created with Pid %d and priority number %d", 
      getpid(), nRpriority);
    }
}

fprintf(f, " %d processes have been created", nInput);
fsortasc(pArray, nInput);   /*sort array into ascending order by nRpriority values*/

// Function Definitions - in alphabetical order
int finval (int nInput)
{
while(nInput <= 0 || nInput > 10)                               
{
    printf("please enter a number between 1 and 10 
");
    scanf("%d", &nInput);                                       
} 
return nInput;                                                
}

int frand (int nInput)
{   
int nRand;
nRand = (rand() % nInput)+1;                  /*set nRand == a random number 
                                               inbetween nInput and 1*/
return nRand;                                 /*return the random number*/
}

void fsortasc(struct strProcess pArray[],int nInput)  
{
struct strProcess temp;     /*temporary storage for elements being swapped*/
int i, j;

for (i = 0; i < nInput - 1; i++)                                 
{
    for (j = 0; j < (nInput - 1-i); j++)
    {
        if (pArray[j].nPriority > pArray[j + 1].nPriority)                      /*if the current element is greater than the next element*/
        {
            temp = pArray[j];                                                   
            pArray[j] = pArray[j + 1];                                          
            pArray[j + 1] = temp;                                               
        }                                                                       
    }
}
答案

我有一个10个结构的数组,我想把该数组放入共享内存?它非常简单,首先创建array 10 struct variable,然后创建shared memory使用shmget所需的size然后attach shared memorypointercopy阵列的10个结构成为与shmat附加的指针。我在下面添加了简单的代码来了解您的要求。

typedef struct company {
        int emp_id;
}cmp;
int main(int argc,char *argv[]) {
        cmp cmp_info[10];
        int shm_id, sze = sizeof(cmp_info) ,i;
        /* I have an array of 10 structs -- with some data like emp_id*/
        for(i=0 ;i<10 ;i++) {
        printf("
 enter emp % Id 
",i);
        scanf("%d",&cmp_info[i].emp_id);
        }
        /* create the shared memory of 'sze' size. */
        shm_id = shmget(10,sze, IPC_CREAT | 0664);
        perror("shmget");
        /* attach the shared memory with shm_id */
        cmp *shm_ptr = shmat(shm_id, NULL, 0);
        perror("shmat");
        /* I have an array of 10 structs and I would like to put that array into shared memory  */
        shm_ptr = cmp_info;//now shared memory contains array of 10 struct data 

        /** print using shm_ptr to verify **/
        for(i=0;i<10;i++) {
        printf("Employee[%d] Id is : [%d]
",i,shm_ptr[i].emp_id);
        }
        /* once above things are done clients program can read from shared memory */
        /** finaly de-atach the shared memory */
        shmdt(shm_ptr);
}

下面的快照用于您的代码,解释在注释中。

struct strProcess {
        int nPriority;
        int nPid;
};
int main(int argc,char *argv[]) {
        // Variable Declarations
        int     nShmid,i,arraySize,nRpriority,j, nInput;
        key_t   nKey;
        char    *ptrshm, *ptrs;
        int     nSize;
        struct  strProcess pArray[10];//array of 10 structure
        struct  strProcess *Array;
        //Array = pArray;
        nKey = 5678;
        FILE *f = fopen("logfile.txt", "w");
        if(f == NULL) {
                printf("Error opening file!
");
                exit(1);
        }
        nSize = sizeof(pArray);
        //create segment
        if((nShmid = shmget(nKey,nSize, IPC_CREAT | 0666)) < 0) {
                perror("shmget");
                exit(1);
        }
        else {
                perror("shmget");
                fprintf(f, "
 shared memory segment created
");
        }
        Array  = shmat(nShmid, NULL, 0);
        perror("shmat");
        /** loop to create exaCtly 10 process */
        nInput = 10; /** call finval function **/
        for(i = 0 ; i < nInput; i++) {
                if(fork() == 0) {
                        srand(getpid());
                        Array[i].nPid = getpid();
                        nRpriority = rand()%10 + 1;//putting random no b/w 1 to 10..u can call your function also
                        Array[i].nPriority = nRpriority;
                        fprintf(f, "
print job created with Pid [%d] and priority number [%d]
",
                                        Array[i].nPid, Array[i].nPriority);
                        break;//must to avoid repeating
                }
                else {
                        ;//parent does nothing
                }
        }
        shmdt(Array);
        //fprintf(f,"
 total [%d] processes have been created
",nInput);
        /* call fsortasc(pArray, nInput); */
        fclose(f);
}

我希望它有所帮助。

以上是关于将一组结构放入unix中的共享内存中,以便客户端程序可以访问它的主要内容,如果未能解决你的问题,请参考以下文章

如何将一组自定义结构保存到 plist swift

量角器 - 如何将一组承诺的结果放入另一个数组

一个生产者+多消费者模型中的同步,共享内存

共享内存程序中的意外输出

Android 怎样将一组json数据的key value对应的放入到listview中显示两列

Linux/UNIX线程