免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1717 | 回复: 0

[Linux] 信号量使用错误 [复制链接]

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
发表于 2016-05-05 20:21 |显示全部楼层
key_t key= ftok("./sem.cpp",'a');总是提示文件不存在,但是不可能不存在啊。我的源代码文件名就是这个呢,还请各位大神看看,指点下,不甚感激
  1. #include <iostream>
  2. #include <sys/sem.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <unistd.h>  
  6. #include <errno.h>
  7. using namespace std;

  8. union semun
  9. {
  10.         int val;
  11.         struct semid_ds *buf;
  12.         unsigned short *array;
  13. };

  14. int del_sem(int semid)
  15. {
  16.         union semun arg;
  17.         if (semctl(semid, 0, IPC_RMID, arg) < 0)
  18.         {
  19.                 cout << "del sem error" << endl;
  20.                 return -1;
  21.         }
  22. }

  23. int  init_sem(int semid)
  24. {
  25.         semun arg;
  26.         arg.val = 0;
  27.         if (semctl(semid, 0,SETVAL,arg)< 0)
  28.         {
  29.                 cout << errno << endl;
  30.                 cout << "cannot init sem" << endl;
  31.                 return -1;
  32.         }
  33. }


  34. int sem_p(int semid)
  35. {
  36.         sembuf buf;
  37.         buf.sem_num = 0;
  38.         buf.sem_flg = SEM_UNDO;
  39.         buf.sem_op = -1;
  40.         if (semop(semid, &buf, 1) < 0)
  41.         {
  42.                 cout << "sem_p error" << endl;
  43.                 return -1;
  44.         }
  45. }

  46. int sem_v(int semid)
  47. {
  48.         sembuf buf;
  49.         buf.sem_num = 0;
  50.         buf.sem_flg = SEM_UNDO;
  51.         buf.sem_op = 1;
  52.         if (semop(semid, &buf, 1) < 0)
  53.         {
  54.                 cout << "sem_v error" << endl;
  55.                 return -1;
  56.         }
  57. }

  58. int main()
  59. {
  60.         key_t key= ftok("./sem.cpp",'a'); //gdb错误提示:No such file or directory.
  61.         int semid = semget(key,1,IPC_CREAT|0x0777);
  62.         if (semid < 0)
  63.         {
  64.                 cout << errno << endl;
  65.                 cout << "cannot semget" << endl;
  66.                 del_sem(semid);
  67.                 return -1;
  68.         }
  69.         init_sem(semid);
  70.         pid_t pid = fork();
  71.         if (pid < 0)
  72.         {
  73.                 cout << "cannot fork" << endl;
  74.                 return -1;
  75.         }
  76.         else
  77.         {
  78.                 if (pid == 0)
  79.                 {
  80.                         //child pid
  81.                         //critical
  82.                         cout << "child progress will wait for 3 seconds" << endl;
  83.                         sleep(3);
  84.                         cout << "child progress exit pid is 0" << endl;
  85.                         sem_v(semid);
  86.                 }
  87.                 else
  88.                 {
  89.                         //father pid
  90.                         sem_p(semid);
  91.                         cout << "father progress exit pid is" <<getpid()<< endl;
  92.                         sem_v(semid);
  93.                         del_sem(semid);
  94.                 }
  95.         }

  96.         return 0;
  97. }
复制代码
总是提醒文件不存在,怎么回事啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP