如何将数据从共享存储器复制到文本文件?

发布于 2025-01-22 13:37:33 字数 1978 浏览 1 评论 0原文

概述:

子过程从命令行中获得数字n,n是学生的数量。学生的数据(名称和标记)在命令窗口中输入。

现在,将在共享内存中复制此数据。父程进程是从共享内存中获取这些数据,然后在文件中复制。这就是我遇到的麻烦。如何将这些数据从共享存储器复制到文件?

struct student {
                char name[20];
                float marks;
               };
               
               
int main(int argc, char* argv[])
{
   key_t key = 10;
   int shmID = shmget(key, 100, 0666 | IPC_CREAT | IPC_EXCL);
   pid_t pid;
   pid=fork();

   if(pid==0) 
    {
     //Child writes data of n number of students
     char* child_at = (char*) shmat (shmID,NULL,0);

     int i,n;
     int a = 0;
     n = atoi(argv[1]);
     struct student stuarr[n];
     printf("Number of students: %d\n",n);


     for (i=0;i<n;++i)
     {
       printf("For student %d\nEnter name: ",i+1);
       scanf("%s",stuarr[i].name);

       printf("Enter marks: ");
       scanf("%f",&stuarr[i].marks);

     }
     printf("\n\tName\tMarks\t\n");

        for(i=0; i<n; i++)
                printf("\t%s\t%.2f\t\n", stuarr[i].name, 
                stuarr[i].marks);



        for (i=0;i<n;i++)
         {
           memcpy(child_at + (a * sizeof(struct student)), &stuarr[i], 
           sizeof(struct student));
           a++;
         }
         int d1 = shmdt(child_at);

}

else if (pid>0)
{
   //Parent creates shared memory, waits. Then writes data of students 
   to file
   char* parent_at = shmat(shmID, NULL, 0);
   wait(NULL);
   int i, n = atoi(argv[1]);
   struct student stuarr[n];
   FILE *fptr;
   fptr=(fopen("student.txt","w"));

   if(fptr==NULL)
   {
     printf("Error!");
     exit(1);
   }

   for (i=0;i<n;i++) 
   {

      //HOW TO COPY DATA FROM SHARED MEMORY TO FILE? 

      //memcpy(&stuarr[i].name, &parent_at[i], n);
      //memcpy(&stuarr[i].marks, &parent_at[i], n);

      fprintf(fptr,"\nName: %s", stuarr[i].name, stuarr[i].marks);
   }

   fclose(fptr); 
   int d2 =shmdt(parent_at);
   shmctl(shmID, IPC_RMID, NULL);

}
}

Overview:

The child process takes a number n from on command line where n is the number of students. The data of students (name and marks) is entered on command window.

Now this data is to be copied in shared memory. The parent process is to then take this data from shared memory and copy in a file. This is what I'm having trouble with. How do I copye this data from shared memory onto a file?

struct student {
                char name[20];
                float marks;
               };
               
               
int main(int argc, char* argv[])
{
   key_t key = 10;
   int shmID = shmget(key, 100, 0666 | IPC_CREAT | IPC_EXCL);
   pid_t pid;
   pid=fork();

   if(pid==0) 
    {
     //Child writes data of n number of students
     char* child_at = (char*) shmat (shmID,NULL,0);

     int i,n;
     int a = 0;
     n = atoi(argv[1]);
     struct student stuarr[n];
     printf("Number of students: %d\n",n);


     for (i=0;i<n;++i)
     {
       printf("For student %d\nEnter name: ",i+1);
       scanf("%s",stuarr[i].name);

       printf("Enter marks: ");
       scanf("%f",&stuarr[i].marks);

     }
     printf("\n\tName\tMarks\t\n");

        for(i=0; i<n; i++)
                printf("\t%s\t%.2f\t\n", stuarr[i].name, 
                stuarr[i].marks);



        for (i=0;i<n;i++)
         {
           memcpy(child_at + (a * sizeof(struct student)), &stuarr[i], 
           sizeof(struct student));
           a++;
         }
         int d1 = shmdt(child_at);

}

else if (pid>0)
{
   //Parent creates shared memory, waits. Then writes data of students 
   to file
   char* parent_at = shmat(shmID, NULL, 0);
   wait(NULL);
   int i, n = atoi(argv[1]);
   struct student stuarr[n];
   FILE *fptr;
   fptr=(fopen("student.txt","w"));

   if(fptr==NULL)
   {
     printf("Error!");
     exit(1);
   }

   for (i=0;i<n;i++) 
   {

      //HOW TO COPY DATA FROM SHARED MEMORY TO FILE? 

      //memcpy(&stuarr[i].name, &parent_at[i], n);
      //memcpy(&stuarr[i].marks, &parent_at[i], n);

      fprintf(fptr,"\nName: %s", stuarr[i].name, stuarr[i].marks);
   }

   fclose(fptr); 
   int d2 =shmdt(parent_at);
   shmctl(shmID, IPC_RMID, NULL);

}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文