POSIX和SYSTEM的消息隊列應該注意的問題

首先看看POSIX的代碼:

1.posix_mq_server.c

#include <mqueue.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#define MQ_FILE "/mq_test"
#define BUF_LEN 128

int main()
{
???? mqd_t mqd;
??? char buf[BUF_LEN];
??? int? por = 0;
??? int ret = 0;
??? struct mq_attr attr;
??? attr.mq_flags = 0;
??? attr.mq_maxmsg = 3;
??? attr.mq_msgsize = 50;
??? attr.mq_curmsgs= 0;
??? mqd = mq_open(MQ_FILE, O_WRONLY,0666,&attr);
??? if (-1 == mqd)
??? {
??????? printf("mq_open error.\n");
??????? return -1;
??? }

??? do{
??????? buf[BUF_LEN-1]='\0';
??????? printf("MQ_MSG : ");
??????? scanf("%s", buf);
??????? if(buf[BUF_LEN-1]!= '\0')
??????? {
??????????? continue;
??????? }
??????? printf("strlen:%d\nMQ_POR : ",strlen(buf));
??????? scanf("%d", &por);
??????? ret== mq_send(mqd, buf, strlen(buf)+1, por);
??????? if (ret != 0)
??????? {
??????????? perror("mq_send error.\n");
??????? }
??????? memset(buf,'\0',BUF_LEN);
??? }while(strcmp(buf, "quit"));

??? mq_close(mqd);
??? mq_unlink(MQ_FILE);

??? return 0;
}
2.posix_mq_client.c


#include <mqueue.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#define MQ_FILE "/mq_test"
#define BUF_LEN 128

int main()
{
??? mqd_t mqd;
??? struct mq_attr attr;
??? char buf[BUF_LEN + 1] = "quit";
??? int cnt;
??? int? por = 0;
??? attr.mq_flags = 0;
??? attr.mq_maxmsg = 128;
??? attr.mq_msgsize = 128;
??? attr.mq_curmsgs = 0;
??? //mqd = mq_open(MQ_FILE, O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR, NULL);
??? mqd = mq_open(MQ_FILE, O_RDONLY | O_CREAT, 0644, &attr);
??? if (-1 == mqd)
??? {
??????? printf("mq_open error.\n");
??????? return -1;
??? }

??? do{
??????? cnt = mq_receive(mqd, buf, BUF_LEN, &por);
??????? if (0 < cnt)
??????? {
??????????? printf("mq receive : ");
??????????? fflush(stdout);
??????????? buf[cnt] = '\0';
??????????? printf("%s? por:%d\n", buf,por);
??????? }

??? }while(strcmp(buf, "quit")==0);

??? printf("\n");
??? mq_close(mqd);
??? mq_unlink(MQ_FILE);

??? return 0;
}

3.makefile

target:client? server
client: posix_mq_client.c
??? gcc posix_mq_client.c -o client -lrt
server:posix_mq_server.c
??? gcc posix_mq_server.c -o server -lrt

clean:
??? rm -f client server
??? rm -f *.o

運行make:

==[]==root@gaoke:~/code$./server
MQ_MSG : fgsdfgsdfgsdfg
MQ_POR : 9
MQ_MSG : dfgsdfgsdfg
MQ_POR : 3
MQ_MSG : dfghsdfhgjghdj
MQ_POR : 6
MQ_MSG : sdfgdgfhgjh
MQ_POR : 2
MQ_MSG : dsfghgjghjkh
MQ_POR : 8
MQ_MSG : sdfgsdfgsdfgsd
MQ_POR : 5
MQ_MSG :

==[]==root@gaoke:~/code$./client
mq receive : fgsdfgsdfgsdfg? por:9
mq receive : dsfghgjghjkh? por:8
mq receive : dfghsdfhgjghdj? por:6
mq receive : sdfgsdfgsdfgsd? por:5
mq receive : dfgsdfgsdfg? por:3
mq receive : sdfgdgfhgjh? por:2
我們發現POSIX是嚴格按照優先級排序讀出的,而且先讀出作業優先級最高的作業。

好了再看看我們的SYSTEM是如何進行的,先寫個簡單的代碼調試運行看看結果如何:

首先我先說明一下System V系統的消息對列對象結構:

01
02
03
04
05
06
07
08
09
10
11
12
13
struct msqid_ds {
????struct ipc_perm???? msg_perm;?// 權限,跟共享內存一樣
????struct msg????? *msg_first;// 指向隊列的第一條消息
????struct msg????? *msg_last;?// 指向隊列的最后一條消息
????msglen_t??????? msg_cbytes;// 當前隊列所占字節數
????msgnum_t??????? msg_qnum;??// 當前隊列的消息數
????msglen_t??????? msg_qbytes;// 隊列允許的最大字節數
????pid_t?????????? msg_lspid;?// 最后調用msgsnd的PID
????pid_t?????????? msg_lrpid;?// 最后調用msgrcv的PID
????time_t????????? msg_stime;?// 最后調用msgsnd的時間
????time_t????????? msg_rtime;?// 最后調用msgrcv的時間
????time_t????????? msg_ctime;?// 最后調用msgctl的時間
}

使用其中一個IPC機制時,系統內核會維護一個ipc權限對象,用于設置讀寫權限

1
2
3
4
5
6
7
8
9
struct ipc_perm {
????uid_t?? uid;???// owner’s user id
????gid_t?? gid;???????// owner’s group id
????uid_t?? cuid;??????// creator’s user id
????gid_t?? cgid;??????// creator’s group id
????mode_t? mode;??// 讀寫權限
????ulong_t seq;???????// 序列號
????key_t?? key;???????// IPC key
其次我們還知道在Linux下,消息隊列被創建在虛擬文件系統中。(其它實現可能也提供這樣的特性,但細節可能不一樣)此文件系統可以使用以下命令掛載(由超級用戶):
# mkdir /dev/mqueue
# mount -t mqueue none /dev/mqueue

?

1.sys_msq_server.c

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MQ_FILE "./mq_test"
#define BUF_LEN 128
struct msgbuf {
?? long mtype;???? /*? message type, must be > 0 */
?? char mtext[256];? /*? message data */
};
int? main()
{
??? struct msqid_ds info={0};
??? struct msgbuf MSG={0};
??? key_t key = ftok(MQ_FILE,10);
??? int cnt =? msgget(key,IPC_CREAT|0666);//0:取消息隊列標識符,若不存在則函數會報錯IPC_CREAT:當msgflg&IPC_CREAT為真時,如果內核中不存在鍵值與key相等的消息隊列,則新建一個消息隊列;如果存在這樣的消息隊列,返回此消息隊列的標識符IPC_CREAT|IPC_EXCL:如果內核中不存在鍵值與key相等的消息隊列,則新建一個消息隊列;如果存在這樣的消息隊列則報錯
??? if(cnt == -1)
??? {
??????? perror("error!");
??? }
??? while(1){
??????? printf("enter the MSG:\n");
??????? scanf("%s",MSG.mtext);
??????? MSG.mtype = 1;
??????? //

??????? msgsnd(cnt,&MSG,strlen(MSG.mtext)+1,IPC_NOWAIT);// 最后一個參數:0:當消息隊列滿時,msgsnd將會阻塞,直到消息能寫進消息隊列IPC_NOWAIT:當消息隊列已滿的時候,msgsnd函數不等待立即返回IPC_NOERROR:若發送的消息大于size字節,則把該消息截斷,截斷部分將被丟棄,且不通知發送進程
??????? msgctl(cnt,IPC_STAT,&info);//IPC_STAT:獲得msgid的消息隊列頭數據到buf中IPC_SET:設置消息隊列的屬性,要設置的屬性需先存儲在buf中,可設置的屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes

??????? printf("uid:%d, gid = %d, cuid = %d, cgid= %d\n" , info.msg_perm.uid,? info.msg_perm.gid,? info.msg_perm.cuid,? info.msg_perm.cgid? ) ;
??????? printf("read-write:%03o, cbytes = %lu, qnum = %lu, qbytes= %lu\n" , info.msg_perm.mode&0777, info.msg_cbytes, info.msg_qnum, info.msg_qbytes ) ;
??????? system("ipcs -q");
??? }
}

?

2.sys_msq_client.c

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MQ_FILE "./mq_test"
#define BUF_LEN 128
struct msgbuf {
?? long mtype;???? /*? message type, must be > 0 */
?? char mtext[256];? /*? message data */
};
int? main()
{
??? struct msqid_ds info={0};
??? struct msgbuf MSG={0};
??? key_t key = ftok(MQ_FILE,10);
??? int cnt =? msgget(key,IPC_CREAT|0666);
??? int size =0;
??? if(cnt == -1)
??? {
??????? perror("error!");
??? }
??? while(1){
??????? size = msgrcv(cnt,&MSG,256,1,IPC_NOWAIT);
??????? if(size > 0)
??????? {
?????????????? puts(MSG.mtext);
??????? msgctl(cnt,IPC_STAT,&info);
??????? printf("uid:%d, gid = %d, cuid = %d, cgid= %d\n" ,info.msg_perm.uid,? info.msg_perm.gid,? info.msg_perm.cuid,? info.msg_perm.cgid? ) ;
??????? printf("read-write:%03o, cbytes = %lu, qnum = %lu, qbytes= %lu\n" , info.msg_perm.mode&0777, info.msg_cbytes, info.msg_qnum, info.msg_qbytes ) ;
??????? }
??? }
}
3.makefile

target:client? server
client: sys_msq_client.c
??? gcc sys_msq_client.c -o client -lrt
server:sys_msq_server.c
??? gcc sys_msq_server.c -o server -lrt

clean:
??? rm -f client server
??? rm -f *.o

然后make運行

==[]==root@gaoke:~/code$./server
enter the MSG:
aaaa
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 5, qnum = 1, qbytes= 65536

------ Message Queues --------
key??????? msqid????? owner????? perms????? used-bytes?? messages???
0xffffffff 0????????? root?????? 666??????? 5??????????? 1??????????

enter the MSG:
dddd
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 10, qnum = 2, qbytes= 65536

------ Message Queues --------
key??????? msqid????? owner????? perms????? used-bytes?? messages???
0xffffffff 0????????? root?????? 666??????? 10?????????? 2??????????

enter the MSG:
fffff
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 16, qnum = 3, qbytes= 65536

------ Message Queues --------
key??????? msqid????? owner????? perms????? used-bytes?? messages???
0xffffffff 0????????? root?????? 666??????? 16?????????? 3??????????

enter the MSG:
ggggg
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 22, qnum = 4, qbytes= 65536

------ Message Queues --------
key??????? msqid????? owner????? perms????? used-bytes?? messages???
0xffffffff 0????????? root?????? 666??????? 22?????????? 4??????????

?==[]==root@gaoke:~/code$./client
asdfasdfas
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 0, qnum = 0, qbytes= 65536
asdfasdfasdf
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 0, qnum = 0, qbytes= 65536
ssss
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 0, qnum = 0, qbytes= 65536

==[]==root@gaoke:~/code$./client
aaaa
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 17, qnum = 3, qbytes= 65536

dddd
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 12, qnum = 2, qbytes= 65536
fffff
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 6, qnum = 1, qbytes= 65536
ggggg
uid:0, gid = 0, cuid = 0, cgid= 0
read-write:666, cbytes = 0, qnum = 0, qbytes= 65536
由此我們還發現了什么呢?有沒有發現SYSTEM的消息輸入長度是固定的,然而POSIX的是可變長的。

?

SYSTEM的消息隊列函數由msgget、msgctl、msgsnd、msgrcv四個函數組成。下面的表格列出了這四個函數的函數原型及其具體說明。

1. ? msgget函數原型

msgget(得到消息隊列標識符或創建一個消息隊列對象)

所需頭文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

函數說明

得到消息隊列標識符或創建一個消息隊列對象并返回消息隊列標識符

函數原型

int msgget(key_t key, int msgflg)

函數傳入值

key

0(IPC_PRIVATE):會建立新的消息隊列

大于0的32位整數:視參數msgflg來確定操作。通常要求此值來源于ftok返回的IPC鍵值

msgflg

0:取消息隊列標識符,若不存在則函數會報錯

IPC_CREAT:當msgflg&IPC_CREAT為真時,如果內核中不存在鍵值與key相等的消息隊列,則新建一個消息隊列;如果存在這樣的消息隊列,返回此消息隊列的標識符

IPC_CREAT|IPC_EXCL:如果內核中不存在鍵值與key相等的消息隊列,則新建一個消息隊列;如果存在這樣的消息隊列則報錯

函數返回值

成功:返回消息隊列的標識符

出錯:-1,錯誤原因存于error中

附加說明

上述msgflg參數為模式標志參數,使用時需要與IPC對象存取權限(如0600)進行|運算來確定消息隊列的存取權限

錯誤代碼

EACCES:指定的消息隊列已存在,但調用進程沒有權限訪問它

EEXIST:key指定的消息隊列已存在,而msgflg中同時指定IPC_CREAT和IPC_EXCL標志

ENOENT:key指定的消息隊列不存在同時msgflg中沒有指定IPC_CREAT標志

ENOMEM:需要建立消息隊列,但內存不足

ENOSPC:需要建立消息隊列,但已達到系統的限制

如果用msgget創建了一個新的消息隊列對象時,則msqid_ds結構成員變量的值設置如下:

???????? msg_qnum、msg_lspid、msg_lrpid、 msg_stime、msg_rtime設置為0。

???????? msg_ctime設置為當前時間。

???????? msg_qbytes設成系統的限制值。

???????? msgflg的讀寫權限寫入msg_perm.mode中。

???????? msg_perm結構的uid和cuid成員被設置成當前進程的有效用戶ID,gid和cuid成員被設置成當前進程的有效組ID。

2. ? msgctl函數原型

msgctl (獲取和設置消息隊列的屬性)

所需頭文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

函數說明

獲取和設置消息隊列的屬性

函數原型

int msgctl(int msqid, int cmd, struct msqid_ds *buf)

函數傳入值

msqid

消息隊列標識符

cmd

?

IPC_STAT:獲得msgid的消息隊列頭數據到buf中

IPC_SET:設置消息隊列的屬性,要設置的屬性需先存儲在buf中,可設置的屬性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes

buf:消息隊列管理結構體,請參見消息隊列內核結構說明部分

函數返回值

成功:0

出錯:-1,錯誤原因存于error中

錯誤代碼

EACCESS:參數cmd為IPC_STAT,確無權限讀取該消息隊列

EFAULT:參數buf指向無效的內存地址

EIDRM:標識符為msqid的消息隊列已被刪除

EINVAL:無效的參數cmd或msqid

EPERM:參數cmd為IPC_SET或IPC_RMID,卻無足夠的權限執行

3. ? msgsnd函數原型

msgsnd (將消息寫入到消息隊列)

所需頭文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

函數說明

將msgp消息寫入到標識符為msqid的消息隊列

函數原型

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)

函數傳入值

msqid

消息隊列標識符

msgp

發送給隊列的消息。msgp可以是任何類型的結構體,但第一個字段必須為long類型,即表明此發送消息的類型,msgrcv根據此接收消息。msgp定義的參照格式如下:

? ??struct s_msg{ /*msgp定義的參照格式*/
???? long type; /* 必須大于0,消息類型 */
?????????? char mtext[256]; /*消息正文,可以是其他任何類型*/
??? } msgp;

msgsz

要發送消息的大小,不含消息類型占用的4個字節,即mtext的長度

msgflg

0:當消息隊列滿時,msgsnd將會阻塞,直到消息能寫進消息隊列

IPC_NOWAIT:當消息隊列已滿的時候,msgsnd函數不等待立即返回

IPC_NOERROR:若發送的消息大于size字節,則把該消息截斷,截斷部分將被丟棄,且不通知發送進程。

函數返回值

成功:0

出錯:-1,錯誤原因存于error中

錯誤代碼

EAGAIN:參數msgflg設為IPC_NOWAIT,而消息隊列已滿

EIDRM:標識符為msqid的消息隊列已被刪除

EACCESS:無權限寫入消息隊列

EFAULT:參數msgp指向無效的內存地址

EINTR:隊列已滿而處于等待情況下被信號中斷

EINVAL:無效的參數msqid、msgsz或參數消息類型type小于0

?? msgsnd()為阻塞函數,當消息隊列容量滿或消息個數滿會阻塞。消息隊列已被刪除,則返回EIDRM錯誤;被信號中斷返回E_INTR錯誤。

?如果設置IPC_NOWAIT消息隊列滿或個數滿時會返回-1,并且置EAGAIN錯誤。

msgsnd()解除阻塞的條件有以下三個條件:

①??? 不滿足消息隊列滿或個數滿兩個條件,即消息隊列中有容納該消息的空間。

②??? msqid代表的消息隊列被刪除。

③??? 調用msgsnd函數的進程被信號中斷。

4. ? msgrcv函數原型

msgrcv (從消息隊列讀取消息)

所需頭文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

函數說明

從標識符為msqid的消息隊列讀取消息并存于msgp中,讀取后把此消息從消息隊列中刪除

函數原型

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,

????????????????????? int msgflg);

函數傳入值

msqid

消息隊列標識符

msgp

存放消息的結構體,結構體類型要與msgsnd函數發送的類型相同

msgsz

要接收消息的大小,不含消息類型占用的4個字節

msgtyp

0:接收第一個消息

>0:接收類型等于msgtyp的第一個消息

<0:接收類型等于或者小于msgtyp絕對值的第一個消息

msgflg

0: 阻塞式接收消息,沒有該類型的消息msgrcv函數一直阻塞等待

IPC_NOWAIT:如果沒有返回條件的消息調用立即返回,此時錯誤碼為ENOMSG

IPC_EXCEPT:與msgtype配合使用返回隊列中第一個類型不為msgtype的消息

IPC_NOERROR:如果隊列中滿足條件的消息內容大于所請求的size字節,則把該消息截斷,截斷部分將被丟棄

函數返回值

成功:實際讀取到的消息數據長度

出錯:-1,錯誤原因存于error中

錯誤代碼

E2BIG:消息數據長度大于msgsz而msgflag沒有設置IPC_NOERROR

EIDRM:標識符為msqid的消息隊列已被刪除

EACCESS:無權限讀取該消息隊列

EFAULT:參數msgp指向無效的內存地址

ENOMSG:參數msgflg設為IPC_NOWAIT,而消息隊列中無消息可讀

EINTR:等待讀取隊列內的消息情況下被信號中斷

msgrcv()解除阻塞的條件有以下三個:

①??? 消息隊列中有了滿足條件的消息。

②??? msqid代表的消息隊列被刪除。

③??? 調用msgrcv()的進程被信號中斷。

?

消息隊列使用程序范例

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法(7)-leetcode-explore-learn-數據結構-數組-小結

leetcode-explore-learn-數據結構-數組5-小結1.概述2.例題2.1旋轉數組2.2 楊輝三角22.3翻轉字符串里的單詞2.4反轉字符串中的單詞32.5 刪除排序數組中的重復項2.6 移動零本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官…

fcntl函數詳解

功能描述&#xff1a;根據文件描述詞來操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()針對(文件)描述符提供控…

使用nohup讓程序永遠后臺運行

使用nohup讓程序永遠后臺運行 Unix/Linux下一般比如想讓某個程序在后臺運行&#xff0c;很多都是使用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在后臺&#xff1a; /usr/local/mysql/bin/mysqld_safe --usermysql &但是加入我們很多程序并不象mysqld一樣做…

算法(8)-leetcode-explore-learn-數據結構-鏈表

leetcode-explore-learn-數據結構-鏈表11.概述1.1 鏈表插入操作1.2 鏈表刪除操作2.設計鏈表本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所…

Mysql索引優化實例講解

MYSQL描述&#xff1a;一個文章庫&#xff0c;里面有兩個表&#xff1a;category和article。category里面有10條分類數據。article里面有20萬條。article里面有一個"article_category"字段是與category里的"category_id"字段相對應的。article表里面已經把…

給自己的VIM配置

編輯 .vimrc 文件如下&#xff1a; filetype plugin on "autocmd Filetype cpp,c,java,cs set omnifunccppcomplete#Complete set nu set nocp set nobackup let g:C_AuthorName gaoke let g:C_AuthorRef gaoke let g:C_Email gaoketaomee.…

shell一文入門通

簡單來說“Shell編程就是對一堆Linux命令的邏輯化處理”。 W3Cschool 上的一篇文章是這樣介紹 Shell的 hello world 學習任何一門編程語言第一件事就是輸出HelloWord了&#xff01;下面我會從新建文件到shell代碼編寫來說下Shell 編程如何輸出Hello World。 (1)新建一個文件…

算法(9)--兩個數的最大公約數

兩個數的最大公約數1.輾轉相除法求解兩個數的最大公約數2.更相減損術求解兩個數的最大公約數3.不嚴格理解1.輾轉相除法求解兩個數的最大公約數 輾轉相除法&#xff1a;兩個正整數a和b&#xff08;a>b&#xff09;的最大公約數等于a除以b的余數與b 之間的最大公約數。–如果…

RPC編程

圖 3 說明在客戶機和服務器之間完成 RPC 涉及的步驟。 圖 3. 在客戶機和服務器之間完成 RPC 涉及的步驟服務器 RPC 應用程序初始化期間它會向 RPC 運行時庫注冊接口。需要注冊接口是因為&#xff0c;客戶機在向服務器發出遠程過程調用時&#xff0c;要檢查它是否與服務器兼容。…

synchronized使用和原理全解

synchronized是Java中的關鍵字&#xff0c;是一種同步鎖。它修飾的對象有以下幾種&#xff1a; 修飾一個方法 被修飾的方法稱為同步方法&#xff0c;其作用的范圍是整個方法&#xff0c;作用的對象是調用這個方法的對象&#xff1b; 修飾一個靜態的方法 其作用的范圍是整個…

RPC學習筆記

在查看libc6-dev軟件包提供的工具&#xff08;用 dpkg -L libc6-dev 命令&#xff09;的時候&#xff0c;發現此軟件包提供了一個有用的工具rpcgen命令。通過rpcgen的man手冊看到此工具的作用是把RPC源程序編譯成C語言源程序&#xff0c;從而輕松實現遠程過程調用。下面的例子程…

算法(10)-leetcode-explore-learn-數據結構-鏈表雙指針技巧

leetcode-explore-learn-數據結構-鏈表21.概述2.例題2.1 環形鏈表判斷2.2 環形鏈表22.3 相交鏈表2.4 刪除鏈表的倒數第N個節點3.小結本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn…

一個簡單的游戲服務器框架

最近看到百度空間的一個帖子&#xff0c;不錯&#xff0c;在這里整理下&#xff0c;轉載至我的博客里&#xff0c;開始自己慢慢琢磨寫一個框架。 我先從上層結構說起&#xff0c;一直到實現細節吧&#xff0c;想起什么就寫什么。 第一部分 服務器邏輯 服務器這邊簡單的分為三…

堆和棧的精華大總結

Java內存分配原理 棧、堆、常量池雖同屬Java內存分配時操作的區域&#xff0c;但其適用范圍和功用卻大不相同。 一般Java在內存分配時會涉及到以下區域&#xff1a; ◆寄存器&#xff1a;我們在程序中無法控制 ◆棧&#xff1a;存放基本類型的數據和對象的引用&#xff0c;但…

算法(11)-leetcode-explore-learn-數據結構-鏈表的經典問題

leetcode-explore-learn-數據結構-鏈表31.反轉一個鏈表2.移除鏈表元素3.奇偶鏈表4.回文鏈表5.小結本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-l…

探索式軟件測試

James A.Whittaker [美] 詹姆斯惠特克&#xff08;軟件測試領域絕對的大師&#xff09;著作《Exploratory Software Testing》&#xff0c;中文名《探索式軟件測試》&#xff0c;記得當時被這本書深深吸引啦&#xff08;我不知道有多少做測試的小伙伴看過這本書&#xff09;&am…

Linux線程池的設計

我設計這個線程池的初衷是為了與socket對接的。線程池的實現千變萬化&#xff0c;我得這個并不一定是最好的&#xff0c;但卻是否和我心目中需求模型的。現把部分設計思路和代碼貼出&#xff0c;以期拋磚引玉。個人比較喜歡搞開源&#xff0c;所以大家如果覺得有什么需要改善的…

算法(12)-leetcode-explore-learn-數據結構-雙鏈表的設計

leetcode-explore-learn-數據結構-鏈表4雙鏈表的設計本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所有例題的編程語言為python 雙鏈表的設…

安全方面知識

什么是文件上傳漏洞 文件上傳漏洞是指 由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷&#xff0c;而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件 這里上傳的文件可以是木馬&#xff0c;病毒&#xff0c;惡意腳本或者WebShell等。 這種攻擊方式是…

CE游戲外掛工具

CHEAT ENGINE(以下簡稱CE)是我見過的最優秀的游戲作弊工具。它的優點多不勝數&#xff0c;雖然單獨從搜索游 戲里面的數值來說&#xff0c;它并不比其他同類軟件強多少&#xff0c;但它不僅僅是個游戲修改工具&#xff0c;它還有其他游戲修改軟件所沒有的一些特點&#xff0c;例…