linux信號捕捉
⑴ 如何用wifi-linux檢測AP信號強度
一般我們藉助於WIFI相關軟體如「WIFI分析儀」,就可以輕松地查看到我們附近的WIFI網路各自在使用哪個無線信道了,從而為我們的WIFI網路提供了避免附近的多個WIFI網路之間的相互干擾來修改信道以改善WIFI網路使用體驗提供了有力的幫助。下面,通過使用「WIFI分析儀」來完成我們的願望:一、首先,我們要在手機中下載這個軟體。它是用於安卓手機的APP,各大安卓市場中都有下載。正常下載、安裝即可。二、打開手機WLAN開關,並連接到我們的WIFI。這個操作是使用WIFI分析儀的前提。三、在主界面中,點擊右上角的「眼睛」圖標,選擇「接入點列表」項,就可以看到我們附近的所有的WIFI網路的相關信息如SSID,MAC地址,使用的信道及無線頻率等,一目瞭然。四、點擊右上角的「眼睛」圖標,選擇"信道評級"項並點選特定的WIFI網路,就可以看到軟體對所使用的信道的分析評價情況,以及提供了對目前信道1到信道14的分析評價,評價以星號多少作為衡量,星號越多信道的干擾越少,同時推薦了多個「優質」的信道供選擇。五、接下來,我們要做的就是根據WIFI分析儀提供的分析和推薦,進入無線路由器的WEB管理中進行無線的信道的修改了。無線信道的小知識:信道是對無線通信中發送端和接收端之間電波傳輸的通路。802.11b/g的無線網路標准中提供有13個信道,但只提供了三個不互相重疊的信道1,6,11(13),而一般路由器的無線信道,默認是6或自動(選擇)。所以,對於在家使用的無線路由器,建議將信道設成1或11,這樣可以最大限度的避免和附近別家的路由器發生信號重疊、干擾,從而保證WIFI信號達到比較好的狀況。
⑵ Linux中,shell腳本如何使用信號機制去控制線程的開啟關閉
trap是Linux的內建命令,用於捕捉信號,trap命令可以指定收到某種信號時所執行的命令。trap命令的格式如下:trap command sig1 sig2 ... sigN,當接收到sinN中任意一個信號時,執行command命令,command命令完成後繼續接收到信號前的操作,直到腳本結束。利用trap命令捕捉INT信號(即與Ctrl+c綁定的中斷信號)。trap還可以忽略某些信號,將command用空字元串代替即可,如trap "" TERM INT,忽略kill %n和Ctrl+c發送的信號(kill發送的是TERM信號)。Linux更強勁的殺死進程的命令:kill -9 進程號(或kill -9 %n作業號)等價與kill -KILL 進程號。
舉個例子:
最近小A需要生產2015年全年的KPI數據報表,現在小A已經將生產腳本寫好了,生產腳本一次只能生產指定一天的KPI數據,假設跑一次生產腳本需要5分鍾,那麼:
如果是循環順序執行,那麼需要時間:5 * 365 = 1825 分鍾,約等於 6 天
如果是一次性放到linux後台並發執行,365個後台任務,系統可承受不住哦!
既然不能一次性把365個任務放到linux後台執行,那麼,能不能實現自動地每次將N個任務放到後台並發執行呢?當然是可以的啦。
#!/bin/bash
source/etc/profile;
#-----------------------------
tempfifo=$$.fifo#$$表示當前執行文件的PID
begin_date=$1#開始時間
end_date=$2#結束時間
if[$#-eq2]
then
if["$begin_date">"$end_date"]
then
echo"Error!$begin_dateisgreaterthan$end_date"
exit1;
fi
else
echo"Error!Notenoughparams."
echo"Sample:shloop_kpi2015-12-012015-12-07"
exit2;
fi
#-----------------------------
trap"exec1000>&-;exec1000<&-;exit0"2
mkfifo$tempfifo
exec1000<>$tempfifo
rm-rf$tempfifo
for((i=1;i<=8;i++))
do
echo>&1000
done
while[$begin_date!=$end_date]
do
read-u1000
{
echo$begin_date
hive-fkpi_report.sql--hivevardate=$begin_date
echo>&1000
}&
begin_date=`date-d"+1day$begin_date"+"%Y-%m-%d"`
done
wait
echo"done!!!!!!!!!!"
第6~22行:比如:sh loop_kpi_report.sh 2015-01-01 2015-12-01:
$1表示腳本入參的第一個參數,等於2015-01-01
$2表示腳本入參的第二個參數,等於2015-12-01
$#表示腳本入參的個數,等於2
第13行用於比較傳入的兩個日期的大小,>是轉義
第26行:表示在腳本運行過程中,如果接收到Ctrl+C中斷命令,則關閉文件描述符1000的讀寫,並正常退出
exec 1000>&-;表示關閉文件描述符1000的寫
exec 1000<&-;表示關閉文件描述符1000的讀
trap是捕獲中斷命令
第27~29行:
第27行,創建一個管道文件
第28行,將文件描述符1000與FIFO進行綁定,<讀的綁定,>寫的綁定,<>則標識對文件描述符1000的所有操作等同於對管道文件$tempfifo的操作
第29行,可能會有這樣的疑問:為什麼不直接使用管道文件呢?事實上這並非多此一舉,管道的一個重要特性,就是讀寫必須同時存在,缺失某一個操作,另一個操作就是滯留,而第28行的綁定文件描述符(讀、寫綁定)正好解決了這個問題
第31~34行:對文件描述符1000進行寫入操作。通過循環寫入8個空行,這個8就是我們要定義的後台並發的線程數。為什麼是寫空行而不是寫其它字元?因為管道文件的讀取,是以行為單位的
第37~42行:
第37行,read -u1000的作用就是讀取管道中的一行,在這里就是讀取一個空行;每次讀取管道就會減少一個空行
第39~41行,注意到第42行結尾的&嗎?它表示進程放到linux後台中執行
第41行,執行完後台任務之後,往文件描述符1000中寫入一個空行。這是關鍵所在了,由於read -u1000每次操作,都會導致管道減少一個空行,當linux後台放入了8個任務之後,由於文件描述符1000沒有可讀取的空行,將導致read -u1000一直處於等待。
⑶ linux系統上信號發送和信號接收講解
用於進程間通信,通信機制由操作系統保證,比較穩定。
在linux中可以通過kill -l查看所有信號的類型。
kill -信號類型 進程ID
int kill(pid_t pid, int sig);
入參pid :
pid > 0: 發送信號給指定的進程。
pid = 0: 發送信號給 與調用kill函數進程屬於同一進程組的所有進程。
pid < 0: 取|pid|發給對應進程組。
pid = -1:發送給進程有許可權發送的系統中所有進程。
sig :信號類型。
返回值 :成功:0;失敗:-1 (ID非法,信號非法,普通用戶殺init進程等權級問題),設置errno
以OpenHarmony源碼為例,應用ANR後,AbilityManagerService會通知應用mp堆棧信息,就是通過信號量做的。
頭文件位置 :
include <signal.h>
函數解釋 :
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
當接收到指定的信號signum時,就會跳轉到參數handler指定的函數執行。其中handler的入參是信號值。
函數原型 :
signum參數指出要捕獲的信號類型,act參數指定新的信號處理方式,oldact參數輸出先前信號的處理方式(如果不為NULL的話)。
sigaction結構體
sa_handler 信號處理函數
sa_mask 在處理該信號時可以暫時將sa_mask 指定的信號集擱置
sa_flags 指定一組修改信號行為的標志。 它由以下零個或多個的按位或組成
SA_RESETHAND:當調用信號處理函數時,將信號的處理函數重置為預設值SIG_DFL
SA_RESTART:如果信號中斷了進程的某個系統調用,則系統自動啟動該系統調用
SA_NODEFER :一般情況下, 當信號處理函數運行時,內核將阻塞該給定信號。但是如果設置了 SA_NODEFER標記, 那麼在該信號處理函數運行時,內核將不會阻塞該信號
sa_restorer 是一個替代的信號處理程序,當設置SA_SIGINFO時才會用它。
相關函數
int sigemptyset( sigset_t *set);
sigemptyset()用來將參數set信號集初始化並清空。
執行成功則返回0,如果有錯誤則返回-1。
完整示例