三分鐘上手linux系統開發
linux系統程式設計,主要使用c語言,c++是c的超集,也是可以的
完整案例程式碼已上傳github:github.com/neatlife/my…
獲取可用環境
可以使用虛擬機器器安裝一個linux系統進行linux系統開發,雖然mac os和linux非常相似,但是和linux還是有很多小區別的,裝虛擬機器器是最省事的 這裡使用elementary os,下載地址參考:elementary.io/zh_CN/
安裝時,選linux 4.x以上的核心版本即可
介面效果如下:
安裝時可以選英文,安裝後再改成中文C語言標準庫
標準庫中包含下面的庫
- assert.h
- ctype.h
- errno.h
- float.h
- limits.h
- locale.h
- math.h
- setjmp.h
- signal.h
- stdarg.h
- stddef.h
- stdio.h
- stdlib.h
- string.h
- time.h
執行緒庫pthread.h預設支援linux,windows需要額外安裝,參考:sourceforge.net/projects/pt…
程式建立銷燬(fork、wait)等在unistd.h庫,預設支援linux
一個例子-替換訊號處理
對一個執行中的程式執行快捷鍵 Ctrl + C 預設會中斷程式的執行,並使得程式退出
#include <stdio.h>
#include <signal.h>
int
main(int argc,char *argv[])
{
printf("Hello World!");
sleep(300);
}
複製程式碼
效果如下
可以看到當按下ctrl c的時候,程式立馬就退出了,這是因為當按下ctrl c時shell終端向程式傳送了SIGINT訊號。 預設SIGINT訊號的處理是終止程式的執行,可以通過signal.h庫中的signal函式註冊一個新的SIGINT訊號的處理程式替代預設行為,比如受到SIGINT時,簡單列印一個字串
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void
mySigHandler(int sig)
{
printf("in signal handler\n");
}
int
main(int argc,char *argv[])
{
if (signal(SIGINT,mySigHandler) == SIG_ERR) {
printf("替換訊號處理器異常\n");
exit(1);
}
printf("Hello World!\n");
while (1) {
sleep(300);
}
}
複製程式碼
效果如下
可以看到已經成功接管了程式對SIGINT訊號的預設處理了也可以使用kill命令對一個程式傳送SIGINT訊號,SIGINT常理定義再signum-generic.h標頭檔案中
對應的數字是2,對應的kill命令就是 kill -2 程式id 可以看到通過kill工具把SIGINT訊號傳給程式了一些注意的點
對程式傳送SIGINT訊號時,程式會從sleep狀態中醒過來,可以通過無限迴圈讓程式持續執行
while (1) {
sleep(300);
}
複製程式碼
關閉虛擬機器器的節能選項,防止虛擬機器器經常進入隨眠/退出狀態
gsettings reset org.gnome.desktop.interface monospace-font-name
gsettings set org.gnome.desktop.interface cursor-blink false
gsettings set io.elementary.files.preferences single-click false
複製程式碼
SIGINT訊號被替換了,ctrl c 無法終止程式了,可以使用SIGKILL訊號(代號9)終止即kill -9 pid,SIGKILL訊號的處理函式是無法替換的,放心使用。
可以選擇ubuntu作為開發環境,這樣環境問題會比較少