当前位置: 技术问答>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 #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;
}
...
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的调用方式有误,第二个参数应该是一个字符串