下面的服务器代码中有一个字符串进入共享内存变量。
客户端代码显示共享内存中可用的字符串。
完整代码:available in this github link
服务器C

int main(int argc, char *argv[])
{
    /* code to create posix shared memory and posix named semaphore */

    /* critical section start */

    snprintf(shared_msg->content, MAX_MSG_LENGTH, "%s", argv[1]);

    /* critical section end */
}

客户C
int main(int argc, char *argv[])
{
    /* code to open posix shared memory and posix named semaphore */

    for(i=0; i<20; i++){
        /* critical section start */

       //operation of semaphore
        while(loop < 15){
            printf("Type : %d, content : %s\n", shared_msg->type, shared_msg->content);
            sleep(1);
            loop++;
        }

     /* Critical section end */

    loop = 0;
    printf("loop %d finished\n", i);
      }
}

如何在上述代码中使用(wait和post)posix信号量,以达到以下要求
当客户端启动时,它必须显示共享内存数据。内部while循环完成后,只有客户端释放共享内存。
如果服务器启动并尝试将数据写入共享内存,则当客户端在循环运行时,信号量将不允许写入,直到所有客户端释放信号量。
在单行中,当客户端释放信号量时,服务器必须写入
谢谢。

最佳答案

您需要一个准互斥或二进制信号量,即一次只有一个进程可以访问资源,在本例中是共享内存。所以这看起来不对:

mysem = sem_open(SEMOBJ_PATH, O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG, 2);

您希望初始值为1。要写入共享内存的第一个进程调用sem_wait将ctr递减为0,从而迫使调用sem_wait的任何其他进程等待该值为非零。换句话说,信号量被锁定,直到保持它的进程执行sem_post
你的伪代码看起来基本正确。当你进入临界区时,sem_wait当你退出时,sem_post。据我所知,我认为您的问题在于在sem_open上错误地初始化信号量。

关于c - 使用信号量的共享内存安全写入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17748650/

10-15 04:45