2

下面的服务器代码将其中一个字符串放入共享内存变量中。

客户端代码显示共享内存中可用的字符串。

完整代码:在这个 github 链接中可用

服务器.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);
      }
}

如何在上述代码中使用(等待和发布)POSIX 信号量,以实现以下要求

  • 当客户端启动时,它必须显示共享内存数据。一旦内部while循环完成,则只有客户端释放共享内存。
  • 如果服务器启动并尝试将数据写入共享内存,当客户端在循环运行时,信号量将不允许写入,直到客户端释放信号量。
  • 单行服务器必须在客户端释放信号量时写入

谢谢。

4

2 回答 2

1

你想要一个准互斥量或二进制信号量,即一次只有一个进程可以访问资源,在这种情况下是共享内存。所以这看起来是错误的:

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

于 2013-07-19T15:23:12.100 回答
0

根据@Duck 的回答,我重写了代码。现在我得到了预期的输出。

如@Duck answer中所述,我用 1 初始化信号量

更新 server.c

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

  /* critical section start */
  sem_wait(mysem); //update
  snprintf(shared_msg->content, MAX_MSG_LENGTH, "%s", argv[1]);

  /* critical section end */
}

更新了client.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++;
    }
    sem_post(mysem);
 /* Critical section end */

    loop = 0;
    printf("loop %d finished\n", i);
   }
}
于 2013-07-22T17:06:44.723 回答