具有共享存储器
问题描述:
二维数组我有2个程序,相互使用共享存储器的块进行通信。具有共享存储器
第一个程序从命令行接受一个参数并分叉指定的次数,每个子进程的ID和一个随机生成的数存储在一个2D数组中,然后应该传递给第二个程序通过连接的内存块。问题是我不知道如何做到这一点,并希望得到一些帮助,因为我在这方面有点新手。
这是迄今第一个程序的代码,并经过全面的测试和工作:
#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! */
}
对不起,我的代码巨大的墙,只是为了帮助理解我的工作, 像我说,任何关于共享内存的帮助将非常感谢,因为我有点不在我的深处!
答
写时复制机制将分配一个新指针的时刻,你改变了它的第二个过程......而当它死将采取与它不同的数据的新分配的内存...溶液被分配一个动态指针...当你改变它的价值也不会动态地分配一个新的,用旧的,改变其数据
#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);
}
首先考虑,然后创建共享内存块只是用它作为你的阵列。也许演员会帮助明显。 – user133831