導航:首頁 > 操作系統 > 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隊列相關的資料

熱點內容
桌面兩個微信怎麼都加密碼 瀏覽:276
長沙單身程序員 瀏覽:883
伺服器下載異常是因為什麼 瀏覽:703
java防刷 瀏覽:842
3dmax取消當前命令 瀏覽:359
顯示當前模式下所有可執行的命令 瀏覽:758
為什麼程序員拿了股份還要高薪 瀏覽:946
電腦運行命令里的記錄能刪嗎 瀏覽:697
linuxwss 瀏覽:848
一個軟體需要登錄伺服器地址 瀏覽:923
哪裡有解壓程序 瀏覽:299
java靜態方法內存 瀏覽:545
我的世界ec伺服器如何帶vip 瀏覽:737
什麼是由解析器域名和伺服器構成 瀏覽:414
自動識別電影信息源碼 瀏覽:850
柱筋箍筋加密區怎麼算 瀏覽:48
鋼筋中加密15倍是什麼意思 瀏覽:366
esc加密演算法 瀏覽:518
linux運行exe命令 瀏覽:125
一級建造師管理pdf 瀏覽:720