posix 无名信号量 实现进程间同步 失败 sem_init sem_wait sem_post

时间:2022-06-14 17:35:10
问题:posix 无名信号量 实现进程间同步失败  代码框架如下:(写文件代码包含了文件的打开,写入,关闭。其中利用文件锁实现了实现了原子操作,在别处测试过无误)


   sem_t mutex;
   int i;
   sem_init(&mutex,1,1);
   if(0==fork()){
        sem_wait(mutex);
      for(i=0;i<10000;i++){
          /*写字符串"I am child" 到文件 xxx  */
           usleep(10000);
     }
      sem_post(mutex);
   }
  sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);



执行完程序打开 xxx 文件查看写入情况,结果 "I am child" 和 "I am parent"  交替被写入,是不是



12 个解决方案

#1


你的
 sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);
相当于父子进程都执行了
应该放在条件判断 fork() > 0 里面吧

刚学LINUX
仅供参考

#2


用个变量接收一下fork的返回值
然后对返回值进行判断
分别写入父子进程的代码

#3


赞成1楼的,你应该先把/*写字符串"I am parent" 到文件 xxx */写道fork() > 0里面

还有sem_wait是进程里面用的吗?我对这些也不熟悉,只是觉得以前看进程那块的时候没看到,线程里面倒是见过。

#4



  sem_t mutex;
   int i;
   sem_init(&mutex,1,1);
   if(0==fork()){
        sem_wait(mutex);
      for(i=0;i<10000;i++){
          /*写字符串"I am child" 到文件 xxx  */
           usleep(10000);
     }
      sem_post(mutex);
     exit(0);
   }
  sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);



发帖的时候少了个 exit(0);(效果应该和 把父进程里执行的代码放入 fork()>0 一样的), 问题还是找不到

#5


咋红色标记都不显示,郁闷

#6




 sem_t mutex;
   int i;
   sem_init(&mutex,1,1);
   if(0==fork()){
        sem_wait(mutex);
      for(i=0;i<10000;i++){
          /*写字符串"I am child" 到文件 xxx  */
           usleep(10000);
     }
      sem_post(mutex);
      exit(0);
   }
  sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);







#7


如果希望信号灯在进程之间共享,信号灯本身应该放入共享内存吧

#8


7楼大虾能详细点吗

#9


我认为在初始化函数 sem_init((sem_t *__sem, int __pshared, unsigned int __value)) 中第二个参数 pshared 设为1 就是共享了呀

#10


问题解决了,用无名信号量还是不行  ,我用了有名信号量 sem_open();

#11


无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量。
http://wenku.baidu.com/view/378670c20c22590102029d8d.html
百度文库里第3页
五.POSIX信号量详解
1.无名信号量
里面有讲的

一种解决方法是 把那个 无名信号量 存在 共享内存 中 就可以了

#12


sem_wait(sem_t *);
sem_post(sem_t *);
这2个函数用法是不对的,你用的是sem_wait(sem) 这是对变量sem本身的拷贝并非原来的sem只是指相同了,之后调用sem_wait()和sem_post()出现的结果是未定义的。我觉得你是吧参数给弄错类型了,应该写成sem_wait(&sem); sem_post(&sem);

#1


你的
 sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);
相当于父子进程都执行了
应该放在条件判断 fork() > 0 里面吧

刚学LINUX
仅供参考

#2


用个变量接收一下fork的返回值
然后对返回值进行判断
分别写入父子进程的代码

#3


赞成1楼的,你应该先把/*写字符串"I am parent" 到文件 xxx */写道fork() > 0里面

还有sem_wait是进程里面用的吗?我对这些也不熟悉,只是觉得以前看进程那块的时候没看到,线程里面倒是见过。

#4



  sem_t mutex;
   int i;
   sem_init(&mutex,1,1);
   if(0==fork()){
        sem_wait(mutex);
      for(i=0;i<10000;i++){
          /*写字符串"I am child" 到文件 xxx  */
           usleep(10000);
     }
      sem_post(mutex);
     exit(0);
   }
  sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);



发帖的时候少了个 exit(0);(效果应该和 把父进程里执行的代码放入 fork()>0 一样的), 问题还是找不到

#5


咋红色标记都不显示,郁闷

#6




 sem_t mutex;
   int i;
   sem_init(&mutex,1,1);
   if(0==fork()){
        sem_wait(mutex);
      for(i=0;i<10000;i++){
          /*写字符串"I am child" 到文件 xxx  */
           usleep(10000);
     }
      sem_post(mutex);
      exit(0);
   }
  sem_wait(mutex);
  for(i=0;i<1000;i++){
      /*写字符串"I am parent" 到文件 xxx  */
       usleep(10000);
     }
  sem_post(mutex);







#7


如果希望信号灯在进程之间共享,信号灯本身应该放入共享内存吧

#8


7楼大虾能详细点吗

#9


我认为在初始化函数 sem_init((sem_t *__sem, int __pshared, unsigned int __value)) 中第二个参数 pshared 设为1 就是共享了呀

#10


问题解决了,用无名信号量还是不行  ,我用了有名信号量 sem_open();

#11


无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量。
http://wenku.baidu.com/view/378670c20c22590102029d8d.html
百度文库里第3页
五.POSIX信号量详解
1.无名信号量
里面有讲的

一种解决方法是 把那个 无名信号量 存在 共享内存 中 就可以了

#12


sem_wait(sem_t *);
sem_post(sem_t *);
这2个函数用法是不对的,你用的是sem_wait(sem) 这是对变量sem本身的拷贝并非原来的sem只是指相同了,之后调用sem_wait()和sem_post()出现的结果是未定义的。我觉得你是吧参数给弄错类型了,应该写成sem_wait(&sem); sem_post(&sem);