当前位置:  技术问答>linux和unix

关于信号量控制

    来源: 互联网  发布时间:2016-11-05

    本文导语:  《linux环境下C编程指南》中,关于信号量控制的示例7-4,功能是创建一个信号量集,再改变它的读取权限,将改变前后的信号量集的读取权限显示出来。但运行后,有问题,望各位高手指教。 1   #include  2   #includ...

《linux环境下C编程指南》中,关于信号量控制的示例7-4,功能是创建一个信号量集,再改变它的读取权限,将改变前后的信号量集的读取权限显示出来。但运行后,有问题,望各位高手指教。
1   #include 
2   #include 
3   #include 
4   #include 
5   #include 
6
7   #define SEM_NUM 10
8   #define SEM_MODE (IPC_CREAT|0660)
9
10  void printfmode(union semun *arg);
11  void changemode(int sid,char *mode);
12  int main(void)
13  {
14 int semid;
15 union semun semopts;
16 struct semid_ds semds;
17 if((semid=semget(IPC_PRIVATE,SEM_NUM,SEM_MODE))==-1)
18 {
19 fprintf(stderr,"semget error!n");
20 exit(1);
21 }
22 semopts.buf=&semds;
23 if(semctl(semid,0,IPC_STAT,semopts)==-1)
24 {
25 fprintf(stderr,"get semid_ds errorn");
26 exit(1);
27 }
28 printfmode(&semopts);
29 changemode(semid,0600);
30 if(semctl(semid,0,IPC_STAT,semopts)==-1)
31 {
32 fprintf(stderr,"get semid_ds error!n");
33 exit(1);
34 }
35 printfmode(&semopts);
36 if(semctl(semid,0,IPC_RMID,0)buf->sem_perm.mode);
47   return;
48  }
49  void changemode(int sid,char *mode)
50  {
51   int rc;
52   union semun semopts;
53   struct semid_ds mysemds;
54   semopts.buf=&mysemds;
55   rc=semctl(sid,0,IPC_STAT,semopts);
56   if(rc==-1)
57   {
58   printf("semctl errorn");
59   exit(1);
60   }
61   sscanf(mode,"%ho",&semopts.buf->sem_perm.mode);
62   //semopts.buf->sem_perm.mode=mode;
63   semctl(sid,0,IPC_SET,semopts);
64   return;
65  }
运行到46行,出现“段错误”,注释46行后,在61行处同样出现“段错误”。请各位高手指教。

|
1、不要直接引用linux下的头文件,改用sys/sem.h
2、自己定义一个semun联合
3、printfmode函数中使用%o输出
4、changemode函数的第二个参数改用字符串
#include 
#include 
#include 
#include 
...

union semun {
        int             val;
        struct semid_ds *buf;
        unsigned short  *array;
};

...
changemode(semid,"0600");
...
void printfmode(union semun *arg)
{  
printf("mode=%on",arg->buf->sem_perm.mode);
return;
}
...

|
可以断定

指针指向的地方没有空间或者空间不足。

段错误来自于内存溢出。

|
第29行,changmode的调用方式有误,第二个参数应该是一个字符串

    
 
 

您可能感兴趣的文章:

  • 生产者消费者问题为什么不可以共用一个信号量,如果这个信号量可以设置取值固定为0到N,即当信号量取值为N的时候阻塞进程,是否也可以?
  • 关于信号量与UNIX信号的疑问
  • 自旋锁和读写自旋锁、信号量和读写信号量分别有什么区别?
  • semaphore.h sem.c Posix 信号量 System v 信号量
  • 当信号量(灯)遇上信号,help!
  • 书上说,中断用自旋锁,进程,用信号量,但是,为什么中断不能用信号量?
  • 关于消息队列信号量信号共享内存等核心编程的问题(求知若渴!!!.....)
  • 请问线程中的信号量,怎么设置成0,1信号量?
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 多个进程共用一个信号量,如果某个进程死掉,此时又将信号量锁定,其它进程就死掉,有什么办法可以解决这一问题
  • POSIX:有名信号量 和SYStem V的信号量 你用哪个?
  • 信号灯操作报错:semop:EINVAL(信号量集不存在或参数无效)
  • 求助一些关于信号量的问题
  • linux和unix iis7站长之家
  • 关于信号量的问题
  • 为什么中断不能用信号量?
  • 信号量
  • 信号量释放
  • 信号量的烦恼
  • 信号量的问题
  • 求利用命名信号量控制文件访问的问题
  • 求 思路 信号量控制函数中的线程sleep 100微秒。(linux)
  • java信号量控制线程打印顺序的示例分享
  • 求信号量控制例程 up有分
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 信号量的调整值什么意思
  • 请高人指点:在unix下,如何实现二值信号量
  • 信号量实现的同步互斥机制
  • POSIX的信号量随内核存在的问题?
  • 信号量可以用于多进程多线程同时互斥不?
  • 关于信号量的问题(sem)????
  • 在linux下怎么使用信号量?
  • 进程间通信 信号量
  • 关于Linux下的信号量
  • 请问unix下如何设置信号量超时?
  • 用信号量机制解决实际的三个进程同步问题
  • 关于信号量ID的疑问
  • 请教信号量处理函数signal的问题?
  • 信号量编程!
  • 请问下,在嵌入式linux驱动里面可不可以用信号量?
  • 使用信号量如何让父子进程交替运行?
  • 操作系统中的信号量
  • 询问一个信号量问题
  • 请问:p,v对共享区进行操作时, 需要几个信号量啊,一个行不行啊?
  • 问个信号量问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3