Unix 信号量的简单测试

Unix 信号量的简单测试,unix,testing,shared-memory,semaphore,multiprocess,Unix,Testing,Shared Memory,Semaphore,Multiprocess,我试图创建一个简单的程序来测试信号量。我正在分岔这个过程,在每个过程的关键部分折磨变量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_WRI

我试图创建一个简单的程序来测试信号量。我正在分岔这个过程,在每个过程的关键部分折磨变量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;
    }
intmain()
{
int c=0;
sem_t互斥体;
扫描电镜;
//sem_t*互斥=(sem_t*)mmap(NULL,sizeof(sem_t*),PROT_READ | PROT|u WRITE,MAP|SHARED | MAP|u ANONYMOUS,-1,0);
sem_init(&mutex,0,1);
sem_init(&mutex1,0,1);
皮迪;
int id=fork();
如果(id==-1){}
else if(id==0)
{
sem_等待(&mutex);
C++;
sem_post(和互斥);
}
其他的
{
sem_等待(&mutex);
C++;
sem_post(和互斥);
}    
cout如果使用,则必须在分叉进程之间共享信号量。有关更多详细信息,请参阅

或者,您可以使用命名的信号量,有关详细信息,请参阅,以及
另外。

您的主要错误是变量
c
本身没有共享-每个进程都在其自身的变量副本上运行。您希望这样:

int *c;

c = mmap(NULL, sizeof(*c), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
*c = 0;

// ... later ...
++*c;
此外,关于您的
sem_init()
示例,您应该:

  • 分配正确大小的共享内存:
    sizeof(sem\u t)
    而不是
    sizeof(sem\u t*)
  • sem\u init()期间设置pshared标志
fork()
之后,您可能不需要区分父对象和子对象的条件逻辑。毕竟,您希望它们做同样的事情

(另外,请不要将POSIX信号量命名为“mutex”。这个名称会误导那些急躁、思想偏执的人,他们会认为你指的是另一种同步原语。)


关于您的
semget()
示例,您在子进程中似乎在等待信号量两次(
sb.sem\u op=-1
)。对父进程的post-
fork()
检查不正确-您检查返回的PID是否为1(在典型的UNIX系统上它永远不会出现),而不是检查返回的PID是否大于0。(不过,在这里,您可能不需要让家长和孩子做不同的事情。)

请花点时间正确格式化您发布的代码。我刚刚编辑了它。谢谢。请通过IDE或类似功能运行您的代码-您手工编辑的格式仍然不一致,很难理解。请包括编译所需的标题。请排除像
mutex1
这样的无关代码。是的,我没有我知道,但它仍然不起作用。我正在运行Linux mint 14。你认为这可能是个问题吗?谢谢。
int *c;

c = mmap(NULL, sizeof(*c), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
*c = 0;

// ... later ...
++*c;