共有メモリ(実際には一般的に動的に割り当てられます)を使用する場合は、「[i] [j]」の代わりに、次の演算を使用して2Dデータにアクセスすることをお勧めします。
*(pointer + row * ncols + col) = ...
また、文字列 ""(const char *)の代わりに文字''を使用する必要があります。サンプルでは、fill関数は次のようになります。
void fill(char *p, int rows, int cols)
{
int i, j;
for(i=0; i<rows; i++)
{
for(j=0;j<cols;j++)
{
/* p[i][j] = ' '; */
*(p + i*cols + j) = ' ';
}
}
}
もう1つ、さらに良いのは、memsetを使用することです。
void fill(char *p, int rows, int cols)
{
memset(p, (int)' ', cols*rows);
}
そして、主なサンプル:
int main()
{
int shmid;
void *shmPtr;
char *shm;
/* create the shared segment */
if ((shmid = shmget(IPC_PRIVATE, sizeof(char) * (3*3), IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
/* use it on the parent process */
if ((shmPtr = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
shm = (char *)shmPtr;
/* fill with spaces */
fill(shmPtr, 3, 3);
int i;
/* some forks, sample */
for (i = 0; i < 10; i++) {
if (fork() == 0) {
... child workd ...
}
}
...
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
可能であれば、mmap
SysV共有メモリの代わりにもう1つ使用してみてください。