免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2450 | 回复: 3
打印 上一主题 下一主题

[C] linux系统下C语言编程入门-信号量部分的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-29 14:40 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <limits.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <sys/stat.h>
  8. #include <sys/wait.h>
  9. //#include <sys/rpc.h>
  10. #include <sys/sem.h>
  11. #define PERMS S_IRUSR|S_IWUSR
  12. #define MAX_COUNT 10240
  13. void init_semaphore_struct(struct sembuf *sem,int semnum,int semop,int semflg){
  14.         /**/
  15.         sem->sem_num=semnum;
  16.         sem->sem_op=semop;
  17.         sem->sem_flg=semflg;
  18. }
  19. int del_semaphore(int semid){
  20.         #if 1
  21.         return semctl(semid,0,IPC_RMID);
  22.         #endif
  23. }

  24. int main(int argc,char **argv){
  25.         char buffer[MAX_COUNT],*c;
  26.         int i,n;
  27.         int semid,semop_ret,status;
  28.         pid_t childpid;
  29.         struct sembuf semwait,semsignal;
  30.         if((argc!=2) || ((n=atoi(argv[1]))<1))
  31.         {
  32.                 fprintf(stderr,"Usage:.....");
  33.                 exit(1);
  34.                         }
  35.         /**/
  36.         if((semid=semget(IPC_PRIVATE,1,PERMS))==-1){
  37.         fprintf(stderr,"Access Sem error");
  38.         exit(1);
  39.         }
  40.         /**/
  41.         init_semaphore_struct(&semwait,0,-1,0);
  42.         /**/
  43.         init_semaphore_struct(&semwait,0,1,0);
  44.         /**/
  45.         if(semop(semid,&semsignal,1)==-1){
  46.                 fprintf(stderr,"Increasment sem error 1");
  47.                 if(del_semaphore(semid)==-1)
  48.                
  49.                 fprintf(stderr,"Destory error 2");
  50.         exit(1);
  51. }
  52.         for(i=0;i<n;i++)
  53.                 if(childpid=fork()) break;
  54.                 sprintf(buffer,"[i=%d]->[process=%d]->[parent=%d]->[child=%d]\n",i,getpid(),
  55.                                                 getppid(),childpid);
  56.                 c=buffer;
  57.                 /**/
  58.         while(((semop_ret=semop(semid,&semwait,1))==-1) && (errno==EINTR));
  59.         if(semop_ret==-1){
  60.                 fprintf(stderr,"Deccreatment error3");
  61.         }
  62.         else{
  63.                 while(*c!='\0')fputc(*c++,stderr);
  64.                 /**/
  65.                 while(((semop_ret=semop(semid,&semsignal,1))==-1) && (errno==EINTR))
  66.                 {;}
  67.                 if(semop_ret==-1)
  68.                         fprintf(stderr,"Increat error3");
  69.        
  70.         }
  71.         /**/
  72.         fprintf(stderr," wait");
  73.         while((wait(&status)==-1) && (errno==EINTR));
  74.         fprintf(stderr,"i is %d\n",i);
  75.         if(i==1)
  76.                 if(del_semaphore(semid)==-1)
  77.                 fprintf(stderr,"Destory error4");
  78.         exit(0);

  79. }



复制代码

[ 本帖最后由 amoyppa 于 2006-5-29 14:53 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-29 14:58 |只看该作者
-------
1、为什么第一次运行的时候比较乱?
2、为什么第2次运行的时候就不乱了呢?
3、这个程序的这段

  1. while(((semop_ret=semop(semid,&semsignal,1))==-1) && (errno==EINTR))
复制代码

后面那个print为什么打不出来东西?
谢谢!

q2.jpg (65.38 KB, 下载次数: 24)

q2.jpg

论坛徽章:
0
3 [报告]
发表于 2006-05-30 08:41 |只看该作者
up一下,希望高手看到..

论坛徽章:
0
4 [报告]
发表于 2010-12-02 15:15 |只看该作者
晕啊!呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP