导航:首页 > 操作系统 > linux队列

linux队列

发布时间:2022-04-29 12:03:21

‘壹’ linux内核中等待队列的几种用法

1. 睡眠等待某个条件发生(条件为假时睡眠):
睡眠方式:wait_event, wait_event_interruptible
唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真)
2. 手工休眠方式一:
1)建立并初始化一个等待队列项
DEFINE_WAIT(my_wait) <== wait_queue_t my_wait; init_wait(&my_wait);
2)将等待队列项添加到等待队列头中,并设置进程的状态
prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)
3)调用schele(),告诉内核调度别的进程运行
4)schele返回,完成后续清理工作
finish_wait()
3. 手工休眠方式二:
1)建立并初始化一个等待队列项:
DEFINE_WAIT(my_wait) <== wait_queue_t my_wait; init_wait(&my_wait);
2)将等待队列项添加到等待队列头中:
add_wait_queue
3)设置进程状态
__set_current_status(TASK_INTERRUPTIBLE);
4)schele()
5)将等待队列项从等待队列中移除
remove_wait_queue()
其实,这种休眠方式相当于把手工休眠方式一中的第二步prepare_to_wait拆成两步做了,即prepare_to_wait <====add_wait_queue + __set_current_status,其他都是一样的。
4. 老版本的睡眠函数sleep_on(wait_queue_head_t *queue):

‘贰’ linux下用proc函数怎么实现循环队列

为充分利用向量空间,克服顺序存储结构的"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。使用求余运算可以判断队列是否已满。

代码
//circular Queue 循环队列实现 #include <stdlib.h>#include <stdio.h> #define MAXSIZE 100typedef int ElemType ; typedef struct { ElemType *base; //存储内存分配基地址 int front; //队列头索引 int rear; //队列尾索引}circularQueue; //初始化队列InitQueue(circularQueue *q){ q->base = (ElemType *)malloc((MAXSIZE) * sizeof(ElemType)); if (!q->base) exit(0); q->front = q->rear = 0;} //入队列操作InsertQueue(circularQueue *q, ElemType e){ if ((q->rear + 1) % MAXSIZE == q->front) return; //队列已满时,不执行入队操作 q->base[q->rear] = e; //将元素放入队列尾部 q->rear = (q->rear + 1) % MAXSIZE; //尾部元素指向下一个空间位置,取模运算保证了索引不越界(余数一定小于除数)} //出队列操作DeleteQueue(circularQueue *q, ElemType *e){ if (q->front == q->rear) return; //空队列,直接返回 *e = q->base[q->front]; //头部元素出队 q->front = (q->front + 1) % MAXSIZE;}
更多信息可以参考《Linux就该这么学》

‘叁’ linux如何查看打印队列

lpq命令用于显示打印队列中的打印任务的状态信息。

语法
lpq(选项)

选项
-E:强制使用加密方式与服务器连接;
-P:显示中的打印机上的打印队列状态;;
-U:自动可选的用户名;
-a:报告所有打印机的定义任务;
-h:指定打印服务器信息;
-l:使用长格式输出;
+:指定显示状态的间隔时间。

‘肆’ linux系统编程中的消息队列该怎么使用呀

消息队列用于进程间通信,每个进程可以,只要该消息queueID队列

的#ifndef CMSGOP_H

#定义CMSGOP_H

#包括类型。 H>

#包括ipc.h>

#包括msg.h>中

类CMsgOp

{

公众:

CMsgOp ();

虚拟CMsgOp();

typedef结构_customMessageFormat {

整数PROCESSID;

整数CMD;

整数commandArg;

} CCustomMessageFormat; BR p>诠释的init();

整数发送(常量CCustomMessageFormat&消息);

整数接收(CCustomMessageFormat&消息);

私人:

整数msgQueueID;

结构msgbuf sendBuf;

结构msgbuf recvBuf;

};

#ENDIF / / CMSGOP_H

的#include“ cmsgop.h“

#包括中

#包括中

#包括中

CMsgOp :: CMsgOp()
> {

}

CMsgOp ::CMsgOp()

{

了msgctl(msgQueueID,IPC_RMID,NULL);

}

BR />整型CMsgOp :: init()中

的key_t的key = ftok的(“/ home/maemo/tmp2”,1);

如果(-1 ==键) {

PERROR(“ftok的失败!”);

返回-1;

}

整数RET = msgget(键,IPC_CREAT);
>如果(-1 == RET)

{

PERROR(“创建消息队列失败!”);

返回-1;

}

msgQueueID = RET;

返回0;

}

整数CMsgOp ::发送(常量CCustomMessageFormat&消息)

{的memcpy(sendBuf.mtext,及讯息,大小(CCustomMessageFormat));

sendBuf.mtype = 1;

整数RET =的msgsnd(msgQueueID,&sendBuf,大小(CCustomMessageFormat),0);

如果(-1 = = RET)

{

PERROR(“消息发送失败!”);

返回RET;

}

}

整数CMsgOp: :接收(CCustomMessageFormat&消息)

{

整数RET =的msgrcv(msgQueueID,与recvBuf,大小(CCustomMessageFormat),0,IPC_NOWAIT);

如果( - 1 == RET) {

PERROR(“接收消息失败!”);

返回-1;

}

的memcpy(&消息,recvBuf.mtext,大小(CCustomMessageFormat ));

返回RET;
}

‘伍’ 在Linux驱动程序中,使用等待队列的作用

我帮你搜索到如下的回复希望对你有帮助《Linux就该这么学》
概念与术语
1内核里面的一个队列,可以将对象加入到队列中,
2可以选择条件休眠和无条件休眠,一般情况下是条件休眠用得较多。
3作用:阻塞读。当运用程序读数据但是现在还无数据可读时,往往会先挂起,
4让其他线程先走,等有数据可读时再唤醒。
5那么什么时候唤醒呢?怎样唤醒呢?
6这里等待队列就派上用场了。读的时候若无数据可读则加入到等待队列中,
7写入的时候唤醒这个队列。
8可以类比运用程序编程中的pthread_cond_wait()与pthread_cond_broadcast()记忆。
函数接口
include/linux/wait.h

‘陆’ Linux多线程同步之消息队列有何特点

消息队列是消息的链表,存放在内核中并有消息队列标示符标示。
msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个
消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;取消息很智能,不一定先进先出
①msgget,创建一个新队列或打开一个现有队列
#include
int msgget ( key_t key, int flag );
//成功返回消息队列ID;错误返回-1
②msgsnd: 发送消息
#include
int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )
//成功返回0,错误返回-1
a:
flag可以指定为IPC_NOWAIT;
若消息队列已满,则msgsnd立即出错返回EABAIN;
若没指定IPC_NOWAIT; msgsnd会阻塞,直到消息队列有空间为止
③msgrcv: 读取消息:
ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag );
a. type == 0; 返回消息队列中第一个消息,先进先出
b. type > 0
返回消息队列中类型为tpye的第一个消息
c. type < 0
返回消息队列中类型 <=
|type| 的数据;若这种消息有若干个,则取类型值最小的消息
消息队列创建步骤:
#define
MSG_FILE "."
struct msgtype {
long mtype;
char buffer[BUFFER+1];
};
if((key=ftok(MSG_FILE,'a'))==-1)
{
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
exit
(1);
}
if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)
{
fprintf(stderr,"Creat Message
Error:%s\n", strerror(errno));
exit
(1);
}

‘柒’ linux 内核中,工作队列和线程有什么区别

一句话概括:根本就是两个不同的概念,差别很大。
简单的说:
一般来说,线程是windows上的概念,windows区分进程和线程。而在linux上,统一叫进程,进程是完成某项任务所需资源的集合,同时也是linux基本的执行单元。
工作队列是一个等待被执行的任务链表,由专有的线程来调度、执行。很多linux驱动的中断下半部的实现,都是采用工作队列的方式。

作者:陈彬
链接:
来源:知乎
着作权归作者所有,转载请联系作者获得授权。

阅读全文

与linux队列相关的资料

热点内容
剑网三服务器是怎么运营 浏览:689
快手app快递在哪里查 浏览:473
开发聊天机器人python 浏览:854
程序员入职后无法工作 浏览:951
买海鲜用什么app好 浏览:922
看剧用什么app好 浏览:905
sql命令update 浏览:25
生意不忙怎么解压 浏览:500
欢太健康app在哪里下载 浏览:488
androidtools使用教程 浏览:971
十天突破雅思口语pdf剑9 浏览:295
李诞笑场pdf 浏览:265
自用纸巾做解压笔 浏览:129
银行流水解压码是多少 浏览:895
百度哪个app好用 浏览:316
115广告联盟源码 浏览:494
联通app签到源码 浏览:680
怎么连接另一个服务器的数据库 浏览:742
猫盘洗白命令 浏览:844
168api源码 浏览:967