Unix 信号量的简单测试
我试图创建一个简单的程序来测试信号量。我正在分岔这个过程,在每个过程的关键部分折磨变量c的值,但我得到的c值仍然是1而不是2。即使mmap()未注释。谁能给我解释一下我做错了什么?任何帮助都将不胜感激。我在这方面完全是个新手。非常感谢您抽出时间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
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;