linuxlong
A. 求教linux中關於long long數據類型的處理
long long是C99的東西.編譯時加上C99選項
B. 如何在linux下實現使用命令轉換long字元串到日期
date -d '1970-01-01 UTC 946684800 seconds' +"%Y-%m-%d %T %z"
start_time=`date -d "1970-01-01 UTC $date_start seconds" +"%Y-%m-%d %H:%M:%S"`;
Linux相關的知識點可以網路搜索《Linux就該這么學》學習哦
C. Linux系統編程—消息隊列
消息隊列本質上是位於內核空間的鏈表,鏈表的每個節點都是一條消息。每一條消息都有自己的消息類型,消息類型用整數來表示,而且必須大於 0。每種類型的消息都被對應的鏈表所維護:
其中數字 1 表示類型為 1 的消息,數字2、3、4 類似。彩色塊表示消息數據,它們被掛在對應類型的鏈表上。
值得注意的是,剛剛說過沒有消息類型為 0 的消息,實際上,消息類型為 0 的鏈表記錄了所有消息加入隊列的順序,其中紅色箭頭表示消息加入的順序。
無論你是發送還是接收消息,消息的格式都必須按照規范來。簡單的說,它一般長成下面這個樣子:
所以,只要你保證首4位元組(32 位 linux 下的 long)是一個整數就行了。
舉個例子:
從上面可以看出,正文部分是什麼數據類型都沒關系,因為消息隊列傳遞的是 2 進制數據,不一定非得是文本。
msgsnd 函數用於將數據發送到消息隊列。如果該函數被信號打斷,會設置 errno 為 EINTR。
參數 msqid:ipc 內核對象 id
參數 msgp:消息數據地址
參數 msgsz:消息正文部分的大小(不包含消息類型)
參數 msgflg:可選項
該值為 0:如果消息隊列空間不夠,msgsnd 會阻塞。
IPC_NOWAIT:直接返回,如果空間不夠,會設置 errno 為 EAGIN.
返回值:0 表示成功,-1 失敗並設置 errno。
msgrcv 函數從消息隊列取出消息後,並將其從消息隊列里刪除。
參數 msqid:ipc 內核對象 id
參數 msgp:用來接收消息數據地址
參數 msgsz:消息正文部分的大小(不包含消息類型)
參數 msgtyp:指定獲取哪種類型的消息
msgtyp = 0:獲取消息隊列中的第一條消息
msgtyp > 0:獲取類型為 msgtyp 的第一條消息,除非指定了 msgflg 為MSG_EXCEPT,這表示獲取除了 msgtyp 類型以外的第一條消息。
msgtyp < 0:獲取類型 ≤|msgtyp|≤|msgtyp| 的第一條消息。
參數 msgflg:可選項。
如果為 0 表示沒有消息就阻塞。
IPC_NOWAIT:如果指定類型的消息不存在就立即返回,同時設置 errno 為 ENOMSG
MSG_EXCEPT:僅用於 msgtyp > 0 的情況。表示獲取類型不為 msgtyp 的消息
MSG_NOERROR:如果消息數據正文內容大於 msgsz,就將消息數據截斷為 msgsz
程序 msg_send 和 msg_recv 分別用於向消息隊列發送數據和接收數據。
msg_send 程序定義了一個結構體 Msg,消息正文部分是結構體 Person。該程序向消息隊列發送了 10 條消息。
msg_send.c
程序 msg_send 第一次運行完後,內核中的消息隊列大概像下面這樣:
msg_recv 程序接收一個參數,表示接收哪種類型的消息。比如./msg_recv 4 表示接收類型為 4 的消息,並列印在屏幕。
先運行 msg_send,再運行 msg_recv。
接收所有消息
接收類型為 4 的消息
獲取和設置消息隊列的屬性
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,卻無足夠的許可權執行
D. 【Linux】Linux argument list too long錯誤解決方法
在某個文件夾執行命令完全卡死,(ctrl+z,ctrl+c等都不能用),表現為:
只好關閉當前shell,重新登錄。
產生原因:
該文件夾中有一個服務掛載在該文件夾某一目錄下,因突然關機等異常情況導致該服務無限制等待,機器重啟後也不能正常連接。
解決方法:
查看與該文件夾相應的服務掛載情況:mount -l | grep 有問題文件夾名,如mount -l | grep "/root/bakup"
umount -l 文件夾,此刻,再訪問文件夾即可使用命令了!
作為一個linux用戶/系統管理員, 有些時候你會遇到以下錯誤提示:
bash: /bin/ls: Argument list too long
bash: /bin/rm: Argument list too long
產生原因:
「Argument list too long」參數列表過長錯誤經常發生在用戶在一行簡單命令中提供了過多的參數而導致,經常在ls *, cp *, rm * 等中出現,一般是因為受到 shell 參數個數限制所致
解決方法:
方法1 : 將文件群手動劃分為比較小的組合
這是最基本的方法,只是簡單的使參數數量符合要求,這種方法應用范圍有限,只適用於文件列表中的名字分布比較均勻,另外這也是個初級用戶可以考慮的解決方案,不過需要很多重復命令和對文件名分布的觀察與猜測。
方法2 : 使用find命令
通過find命令,將文件清單輸出到rm命令,使其一次處理一個,這樣就完全避免了過量參數的存在,另外通過不同的參數,可以指定除了名稱以外的時間戳,許可權,以及inode等匹配模式。
方法3: 使用xargs命令
用xargs 命令將文件以每 100 個為一組為單位處理
xargs 命令會將文件以每 100 個為一組做 rm 處理。
方法4: 使用 ls 結合 awk 操作
可以使用 awk 一次刪除一個的方式進行刪除,但必須先進入該目錄下。
Linux 命令 argument list too long 錯誤解決
https://blog.51cto.com/u_14782715/5082973
https://blog.csdn.net/fdipzone/article/details/41558461
Linux刪除文件出現/bin/rm: Argument list too long解決方法
https://southcat.net/1481.html
Linux下經過 rm -f 刪除大量文件時報錯:Argument list too long
http://www.javashuo.com/article/p-pucmuhoh-v.html
Linux文件系統十問
https://mp.weixin.qq.com/s/pOKjwl3ONPMPSRF6RSmvaw
新建一個空文件佔用多少磁碟空間?
https://mp.weixin.qq.com/s/9YeUEnRnegplftpKlW4ZCA
文件過多時ls命令為什麼會卡住?
https://mp.weixin.qq.com/s/g-fFoYsBJkonV3ezdGDJKA
E. linux unsigned long多少位
有符號類型(signed)和無符號類型(unsigned)的長度是相同的。
通常情況下對於32為系統long類型長度為32位,64位系統long類型長度為64位。
可以使用下面的命令來查看系統真實long類型的位數:
$ getconf LONG_BIT