如何将数据从共享存储器复制到文本文件?
概述:
子过程从命令行中获得数字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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论