【发布时间】:2013-11-16 23:06:18
【问题描述】:
我正在尝试创建一个简单的程序来测试信号量。我正在分叉进程并在每个进程的关键部分折磨变量 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;
}
【问题讨论】:
-
请花时间正确格式化您发布的代码。
-
我刚刚编辑了它。谢谢。
-
请通过
indent(1)或 IDE 中的类似功能运行您的代码 - 您的手动编辑仍然格式不一致且难以理解。请包括编译所需的标题。请排除mutex1等无关代码。
标签: unix testing shared-memory semaphore multiprocess