使用共享内存的IPC

使用共享内存的IPC,c,ipc,shared-memory,C,Ipc,Shared Memory,我正在编写一个简单的代码,其中父进程和子进程使用共享内存方法共享一个队列。但是,当子进程修改共享数据时,它并没有以某种方式反映父进程,父进程仍在访问以前的值。 在此处,我附加了一个示例代码,并尝试执行以下操作: int main() { /* Declare fork variables */ pid_t childpid; /* Declare shared memory variables */ key_t key; int shmid; i

我正在编写一个简单的代码,其中父进程和子进程使用共享内存方法共享一个队列。但是,当子进程修改共享数据时,它并没有以某种方式反映父进程,父进程仍在访问以前的值。 在此处,我附加了一个示例代码,并尝试执行以下操作:

int main()
{
    /* Declare fork variables */
    pid_t childpid;

    /* Declare shared memory variables */
    key_t key;
    int shmid;
    int *front;
    int *rear;
    int i;
    /* Declare semaphore variables */
    sem_t sem;
    int pshared = 1;
    unsigned int value = 1;

    /* Initialize Shared Memory */
    key = ftok("thread1.c",'R');
    shmid = shmget(key, 1024, 0644 | IPC_CREAT);

    /* Attach to Shared Memory */
    rear = shmat(shmid, (void *)0, 0);
    if(rear == (int *)(-1))
        perror("shmat");

    front = shmat(shmid, (void *)0, 0);
    if(front == (int *)(-1))
        perror("shmat");

    /* Write initial value to shared memory */
    rear= front;
    /* Write to Shared Memory */
    for(i=0; i<5; i++)
    {
        rear[i] = 5000+(i+1);
    }
    printf("value of front is: %d", *front);
    rear = &rear[i-1];  
    /* Initialize Semaphore */
    if((sem_init(&sem, pshared, value)) == 1)
    {
        perror("Error initializing semaphore");
        exit(1);
    }

    if((childpid = fork()) < 0) // error occured
    {
        perror("Fork Failed");
        exit(1);
    }
    else if(childpid == 0) // child process
    {
        printf("came in child process\n");
        sem_wait(&sem);
        for(i=0; i<3; i++){
            printf("rear is: %d", *rear);
            rear--;
        }
        sem_post(&sem);
        shmdt(rear);

    }
    else // parent process
    {
        /* Write to Shared Memory */
        wait(1);
        sem_wait(&sem);
        printf("came in parent process and rear is: %d\n", *rear);
        sem_post(&sem);
        shmdt(rear);
    }
    return 0;
}
intmain()
{
/*声明fork变量*/
pid_t childpid;
/*声明共享内存变量*/
钥匙(t)钥匙;;
int shmid;
内部*正面;
内部*后部;
int i;
/*声明信号量变量*/
扫描电镜;
int pshared=1;
无符号整数值=1;
/*初始化共享内存*/
key=ftok(“thread1.c”,“R”);
shmid=shmget(键10240644 | IPC|u CREAT);
/*附加到共享内存*/
后=shmat(shmid,(void*)0,0;
如果(后==(整数*)(-1))
佩罗尔(“shmat”);
前=shmat(shmid,(void*)0,0;
如果(前==(整数*)(-1))
佩罗尔(“shmat”);
/*将初始值写入共享内存*/
后=前;
/*写入共享内存*/
对于(i=0;i
您正在尝试创建两个具有相同共享内存id的独立变量

尝试使用2个键和2个共享内存

key1  = ftok("thread1.c",'A');
key2  = ftok("thread1.c",'B');
shmid1 = shmget(key, 1024, 0644 | IPC_CREAT);
shmid2 = shmget(key, 1024, 0644 | IPC_CREAT);
rear = shmat(shmid1, (void *)0, 0);
front = shmat(shmid2, (void *)0, 0);

也许是一个多余的问题,但是什么语言?看起来像C/C++?
key1  = ftok("thread1.c",'A');
key2  = ftok("thread1.c",'B');
shmid1 = shmget(key, 1024, 0644 | IPC_CREAT);
shmid2 = shmget(key, 1024, 0644 | IPC_CREAT);
rear = shmat(shmid1, (void *)0, 0);
front = shmat(shmid2, (void *)0, 0);