QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1143|回复: 3

求助:各位大哥,我这段程序还有点错误,请各位大哥帮我改改,谢

[复制链接]
发表于 2006-7-20 10:00:43 | 显示全部楼层 |阅读模式
#include <sys/types.h>
//#include <sys/ipc.h>
//#include <sys/sem.h>
#include <linux/sem.h>
#include <stdio.h>

#define SEM_NUM 10
#define SEM_MODE (IPC_CREAT|0660)
//void printf_stat(union semun *arg);
void changemode(int sid, char *mode);
void printfmode (union semun *arg);



void printfmode (union semun *arg)
{
            printf("mode=%d:\n", arg->buf->sem_perm.mode);     
           return;
}


int main(void)
{
            int semid;
            union semun semopts;
            struct semid_ds semds;
   
        if ((semid=semget(IPC_PRIVATE, SEM_NUM, SEM_MODE))==-1)
        {
                    fprintf(stderr, "semget error!\n");
                    exit(1);
        }

        semopts.buf=&semds;
        if((semctl(semid,0,IPC_STAT,semopts))==-1)
        {
                      fprintf(stderr, "get semid_ds error!\n");
                    exit(1);
        }
       
        printfmode(&semopts);
        changemode(semid, 0600);
       
       
        if((semctl(semid,0, IPC_STAT, semopts))==-1)
        {
                      fprintf(stderr, "get semid_ds error!\n");
                       exit(1);
        }
            printfmode(&semopts);

        if((semctl(semid,0, IPC_RMID, 0))<0)
        {
                      fprintf(stderr,"semctl error\n");
                      exit(1);
        }
        exit(0);
}


void changemode(int sid, char *mode)
{
            int rc;
            union semun semopts;
            struct semid_ds mysemds;

            semopts.buf=&mysemds;
            rc=semctl(sid,0,  IPC_STAT, semopts);

            if(rc==-1)
            {
                printf("semctl error!\n");
                exit(1);
            }

            sscanf(mode,"%ho", &semopts.buf->sem_perm.mode);
            semctl(sid,0,  IPC_SET, semopts);

            return;
}

[root@localhost linuxc]# gcc -o a40 a40.c
a40.c: In function `main':
a40.c:42: warning: passing arg 2 of `changemode' makes pointer from integer without a cast
[root@localhost linuxc]# ./a40
段错误
[root@localhost linuxc]#




a40.c:42 是 changemode(semid, 0600);


各位大哥,我哪里还需要啊修改呢?

谢谢!
发表于 2006-7-21 11:21:51 | 显示全部楼层
a40.c:42: warning: passing arg 2 of `changemode' makes pointer from integer without a cast
晕啊,看清楚编译器警告啊。
changemode(semid, 0600);  --> changemode(semid, "0600");
回复

使用道具 举报

 楼主| 发表于 2006-7-21 11:50:37 | 显示全部楼层
谢谢大哥,这样该是没有错误了
可是运行时提示段错误!
这是什么原因呢?
谢谢!
回复

使用道具 举报

发表于 2006-7-21 12:48:55 | 显示全部楼层
段错误绝大多数都是访问了非法的地址造成的。
代码请你自己检查,别人怎么知道你的逻辑和目的呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 10:14 , Processed in 0.039968 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表