linux消息队列为啥不能删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux消息队列为啥不能删除相关的知识,希望对你有一定的参考价值。

参考技术A 我用的linux as4 的操作系统,重装了oracle数据库后,以前的老数据文件和里面的文件都不能删除,并且读写和执行的权限都赋权给了oracle和root这两个账号,删除时提示为只读系统文件,请高手指点如何修改文件,能给出相应的命令最好!
msgrcv.c 内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define N 10
typedef struct student

int sno;
char sname[15];
STU;

typedef struct msgbuf

long mtype;
STU stu[N];
MSGBUF;

main(int argc, char* argv[])

int i = 0;
MSGBUF mbf = 0;
mbf.mtype = 1;
int MSQID ;
errno = 0;
char *name = "./msgaaa";
key_t key = ftok(name,0);
MSQID = msgget(key, IPC_CREAT);
while(i < N)

mbf.stu[i].sno = i;
strcpy(mbf.stu[i].sname, "hello");
if (i == 1)

memset(mbf.stu[i].sname, 0, strlen(mbf.stu

[i].sname));
strcpy(mbf.stu[i].sname, "aaa");

if (i == N-1)

memset(mbf.stu[i].sname, 0, strlen(mbf.stu

[i].sname));
strcpy(mbf.stu[i].sname, "end");

printf("------- %s ------", mbf.stu[i].sname);
msgsnd(MSQID, &mbf.stu[i], sizeof(mbf.stu[i]), 0);
if (-1 == errno)

perror("msgsnd");
exit(-1);

printf(" %d -- %s\n", mbf.stu[i].sno, mbf.stu[i].sname);
i++;
sleep(1);
//while
msgctl(MSQID, IPC_RMID, NULL);


msgsnd内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define N 10
typedef struct student

int sno;
char sname[15];
STU;

typedef struct msgbuf

long mtype;
STU stu[N];
MSGBUF;

main(int argc, char* argv[])

int i = 0;
MSGBUF mbf = 0;
mbf.mtype = 1;
int MSQID ;
errno = 0;
char *name = "./msgaaa";
key_t key = ftok(name,0);
MSQID = msgget(key, IPC_CREAT);
while(i < N)

mbf.stu[i].sno = i;
strcpy(mbf.stu[i].sname, "hello");
if (i == 1)

memset(mbf.stu[i].sname, 0, strlen(mbf.stu[i].sname));
strcpy(mbf.stu[i].sname, "aaa");

if (i == N-1)

memset(mbf.stu[i].sname, 0, strlen(mbf.stu[i].sname));
strcpy(mbf.stu[i].sname, "end");

// printf("------- %s ------", mbf.stu[i].sname);
msgsnd(MSQID, &mbf.stu[i], sizeof(mbf.stu[i]), 0);
if (-1 == errno)

perror("msgsnd");
exit(-1);

printf(" %d -- %s\n", mbf.stu[i].sno, mbf.stu[i].sname);
i++;
sleep(1);
//while
msgctl(MSQID, IPC_RMID, NULL);


msgsnd 显示结果:
0 -- hello
1 -- aaa
2 -- hello
3 -- hello
4 -- hello
5 -- hello
6 -- hello
7 -- hello
8 -- hello
9 -- end本回答被提问者和网友采纳

linux消息队列出错argument list too long

参考技术A 它已经告诉你,是因为“参数列表太长”导致的错误。所以需要看看你的哪个参数太长,并且想办法减少参数个数。
比如一个非常非常多文件(比如有超过一百万个文件)的目录,直接用 rm -f * 时,可能就会出这个提示。那可以换一个方法,一次不给 rm 命令太多参数(这里是文件名),就可以逐一删除。一般会用以下命令逐一查找后再执行删除。
find . -name *.* -ok rm \;

以上是关于linux消息队列为啥不能删除的主要内容,如果未能解决你的问题,请参考以下文章

linux 消息队列

啥是消息队列?为啥要用消息队列?有那些常用的消息队列?一文解答你的疑问

啥是消息队列?为啥要用消息队列?有那些常用的消息队列?一文解答你的疑问

消息队列为啥用redis实现

为啥从队列中并行读取消息很慢?

为啥将消息放入死信队列 (MSMQ)?