免费注册 查看新帖 |

Chinaunix

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

[C] 消息队列读取 文件属性问题!~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-10 18:45 |只看该作者 |倒序浏览
5可用积分
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/stat.h>
#include<string.h>
#include<stdlib.h>
char * GetFileMode(mode_t st_mode, char *resp)//读取文件权限
{
        memset(resp, '-', 9);
        if (st_mode & S_IRUSR) resp[0] = 'r';
        if (st_mode & S_IWUSR) resp[1] = 'w';
        if (st_mode & S_IXUSR) resp[2] = 'x';
        if (st_mode & S_IRGRP) resp[3] = 'r';
        if (st_mode & S_IWGRP) resp[4] = 'w';
        if (st_mode & S_IXGRP) resp[5] = 'x';
        if (st_mode & S_IROTH) resp[6] = 'r';
        if (st_mode & S_IWOTH) resp[7] = 'w';
        if (st_mode & S_IXOTH) resp[8] = 'x';
        resp[9] = 0;
        return resp;
}
int StatMsg(int msgid)
{
        char resp[20];
        struct msqid_ds buf;                /* 申请消息队列结构缓冲区 */
        memset(&buf, 0, sizeof(buf));        /* 置空消息队列结构缓冲区 */
        msgctl(msgid, IPC_STAT, &buf);        /* 读取消息队列结构 */
        /* 转化消息队列结构并打印 */
        fprintf(stderr, "T     ID        KEY       MODE      OWNER      GROUP     CBYTES       QNUM     QBYTES\n");
        fprintf(stderr, "q %6d %#10.8x %10s %10d %10d %10d %10d %10d\n",
                msgid,                                         /* 标识号 */
                buf.msg_perm.__key,                         /* 关键字 */
                GetFileMode(buf.msg_perm.mode, resp),         /* 访问权限 */ 我用gdb调试时 这里的 mode=0; ??????
                buf.msg_perm.uid,                         /* 有限用户ID */
                buf.msg_perm.gid,                         /* 有限组ID */
                buf.msg_cbytes,                         /* 队列当前的消息字节数 */
                buf.msg_qnum,                                 /* 队列当前的消息个数 */
                buf.msg_qbytes);                        /* 队列可以容纳的最大字节数 */
                return 0;
}

int main(int argc, char *argv[])
{
        int msgid;
        if (argc != 2 && argc != 3) return -1;
       
        msgid =atoi(argv[1]);

        if (argc == 2)
        {        /* 查看消息队列信息 */
                StatMsg(msgid);
        }
        else if (argc == 3 && strcmp(argv[2], "c") == 0)
        {        /* 创建消息队列 */
                if (msgget(msgid, 0666|IPC_CREAT|IPC_EXCL) < 0)                
                        fprintf(stderr, "Create msg %#10.8x failed.\n", msgid);
                else fprintf(stderr, "Create msg %#10.8x success.\n", msgid);
        }
        else if (argc == 3 && strcmp(argv[2], "d") == 0)
        {        /* 删除消息队列 */
                if (msgctl(msgid, IPC_RMID, NULL) < 0)
                        fprintf(stderr, "Delete msg %d failed.\n", msgid);
                else fprintf(stderr, "Delete msg %d success.\n", msgid);
        }
        return 0;       
}


-----------------------------------------
编译
meke ipcmsg

运行:
./ ipcmsg 10 c
结果:
Create msg 0xffffffff success.

在运行查看
./ipcmsg  10

结果:
T     ID        KEY       MODE      OWNER      GROUP     CBYTES       QNUM     QBYTES
q     -1   00000000  ---------          0          0          0          0          0

错误在哪里 导致这个结果的发生阿 ~~

[ 本帖最后由 jqx55ah 于 2008-10-10 23:23 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-10 18:56 |只看该作者
进程是不是都已经退出了?

论坛徽章:
0
3 [报告]
发表于 2008-10-10 19:21 |只看该作者
原帖由 雨过白鹭洲 于 2008-10-10 18:56 发表
进程是不是都已经退出了?

恩!
这个./ipcmsg 10 c 退出后  消息队列还存在吧

论坛徽章:
0
4 [报告]
发表于 2008-10-10 21:46 |只看该作者
自己顶下!
遇到问题 不解决  难受哈

论坛徽章:
0
5 [报告]
发表于 2008-10-10 22:52 |只看该作者

这是你自身的问题吧。

你如果是用Make工具的话,那么你在Make命令后面是不需要加上你所要编译的程序了,因为你要编译的程序的命令已经包含在Make文件中了。

论坛徽章:
0
6 [报告]
发表于 2008-10-10 23:24 |只看该作者
原帖由 cwqing1973 于 2008-10-10 22:52 发表
你如果是用Make工具的话,那么你在Make命令后面是不需要加上你所要编译的程序了,因为你要编译的程序的命令已经包含在Make文件中了。

make 命令没有错的
我makefile 支持我这种操作!

论坛徽章:
0
7 [报告]
发表于 2008-10-11 00:08 |只看该作者
UP!
10 11第一贴
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP