C 使用信号量的共享内存安全写入

C 使用信号量的共享内存安全写入,c,linux,ipc,shared-memory,semaphore,C,Linux,Ipc,Shared Memory,Semaphore,下面的服务器代码将一个字符串放入共享内存变量中 客户端代码显示共享内存中可用的字符串 完整代码: 服务器.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, "

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

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

完整代码:

服务器.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);
      }
}
intmain(intargc,char*argv[])
{
/*打开posix共享内存和posix命名信号量的代码*/
对于(i=0;itype,共享消息->内容);
睡眠(1);
loop++;
}
/*临界截面端*/
循环=0;
printf(“循环%d已完成\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\u post


您的伪代码看起来基本正确<代码>扫描等待当您进入关键部分时,以及
扫描发布
当您退出时。据我所知,我认为您的问题在于,根据@Duck I rewrite the code的答案,错误地初始化了
sem_open

上的信号量。现在我得到了预期的输出

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

更新了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);
   }
}
intmain(intargc,char*argv[])
{
/*打开posix共享内存和posix命名信号量的代码*/
对于(i=0;itype,共享消息->内容);
睡眠(1);
loop++;
}
教统局局长职位(mysem),;
/*临界截面端*/
循环=0;
printf(“循环%d已完成\n”,i);
}
}

您是否尝试过在命令行中使用
man sem\u overview
?是的。我仍然有些挣扎。什么客户端服务器通过共享内存进行通信?为什么不用管子或插座?@ScottyBauer:我也可以用其他的。我只需要理解命名的信号量,所以我选择了POSIX共享内存和信号量。这可能会有帮助吗?