unix - 信号量的简单测试

标签 unix testing shared-memory semaphore multiprocess

我正在尝试创建一个简单的程序来测试信号量。我正在 fork 进程并在每个进程的关键部分折磨变量 c 的值,但我得到的 c 的值仍然是 1 而不是 2。即使 mmap() 未注释。谁能向我解释我做错了什么?任何帮助,将不胜感激。我是这方面的新手。非常感谢您的宝贵时间。

int main()
{
int c = 0;
  sem_t mutex;
 sem_t mutex1;
 //  sem_t *mutex = (sem_t*)mmap(NULL, sizeof(sem_t*), PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1, 0);
 sem_init(&mutex, 0, 1);
 sem_init(&mutex1, 0, 1);

  pid_t i;
  int id = fork();
 if(id == -1)   {}
  else if(id == 0)
    {
    sem_wait (&mutex);  
   c++;
   sem_post (&mutex);
   }
   else
  {
    sem_wait (&mutex);  
   c++;
   sem_post (&mutex);
   }    
     cout<<c<<endl;
   //system("pause");
   return 0;
    }

我尝试了另一种方法,将 pshared 参数设置为 1,但它仍然不起作用。 我也尝试过 sem_op 但它仍然不起作用。

 int main()
    {


      int c = 0;


           int sid =semget(1105,2, 0666 | IPC_CREAT);


        pid_t i;
      int id = fork();

       if(id == -1)
       {

        }
            else if(id == 0)
           {

                struct sembuf sb;
                sb.sem_num = 0;
                sb.sem_op = -1;
                sb.sem_flg = 0;
                  if((semop(sid, &sb, 1)) == -1)
            cout<<"error"<<endl;

                    c++;

                sb.sem_num = 0;
                sb.sem_op = -1;
                sb.sem_flg = 0;

                      if((semop(sid, &sb, 1)) == -1)
          cout<<"error"<<endl;

         }
         else if(id == 1)
         {

                   struct sembuf sb;

                  if((semop(sid, &sb, 1)) == -1)
            cout<<"error"<<endl;

                    c++;


                     sb.sem_num = 0;
                    sb.sem_op = -1;
                    sb.sem_flg = 0;

                      if((semop(sid, &sb, 1)) == -1)
          cout<<"error"<<endl;

          }

            cout<<c<<endl;

          return 0;

            }

最佳答案

如果您使用 fork()您必须在 fork 进程之间共享信号量。参见 sem_init() manual了解更多详情。

或者,您可以使用命名信号量,参见 sem_open()了解详情,以及 还有a good article on the subject .

关于unix - 信号量的简单测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025060/

相关文章:

c++ - 对共享内存的原子访问

c - 为什么未命名的信号量在共享内存中使用时不会改变?

java - 在 Java/DOS-UNIX 中获取文件格式

bash - unix - 如何从多个输出列表中创建单个字符串

java - 修复无效响应后,扫描仪不允许我继续

c - 使用共享内存将数据结构传递给另一个进程并保存到文件

bash - 如何在 shell 脚本中使用 echo 保留前导空格?

java - Runtime.exec 未运行 "find"命令

ruby-on-rails - 开发环境测试并非 100% 与 Rails 中的暂存/生产兼容

ruby-on-rails-3 - 显示 Rails 测试失败的行号