Linux程式設計學習(續二)

2021-08-22 03:38:30 字數 3794 閱讀 1154

訊號相當於dos下的int或者windows下的訊息。

用kill –l命令可以檢視各種訊號資訊。

用man 7 signal可檢視各個訊號的具體解釋。

軟體原因和硬體原因都會產生訊號。

常用的發訊號的函式包括:

kill

raise

alarm

setitimer

kill(pid_t pid , int sig)

呼叫kill可以向任何程序組或者程序傳送任何訊號。

raise用來向自己傳送訊號sig,它等於kill(getpid(),sig)

alarm函式在seconds秒後向自己傳送乙個sigalrm訊號。比如下面程式:

#include

#include

main()

sigalrm的預設操作是結束程序,因此1秒鐘以後,你可以看到最後的i值是多少。

使用訊號遮蔽可以使程序不受到訊號的打擾。訊號遮蔽用到幾個函式:

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set,int signo);

int sigdelset(sigset_t *set,int signo);

int sigismember(sigset_t *set,int signo);

int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

下面例子演示了函式的使用:

#include

#include

#include

int main(int argc,char **argv)

if((repeat_factor = atoi(argv[1])) < 1)

repeat_factor = 10;

sigemptyset(&intmask); //initializes the signal set given by set to empty.

sigaddset(&intmask,sigint); //add signal of int ctrl+c

while(1)

exit(0);

}另乙個有用的函式是sigaction,用來指定乙個訊號的處理行為。下面例子捕捉ctrl+c的訊號,並輸出乙個提示。

//function sigaction test.

#include

#include

#include

#include

#include

#define prompt "do you want to exit this program?"

char * prompt = prompt;

void ctrl_c_op(int signo)

int main(int argc,char **argv)

while(1);

exit(0);

}還有一些很用於的關於訊號方面的函式,比如:

pause

sigsuspend

sigsetjmp

siglongjmp

上面一些函式對於訊號處理來說能夠應付一般需要,其實訊號的處理遠非這些。

ps –a

man命令是linux下常用的參考文件。有兩個配合使用的命令,就是whatis和。apropos。whatis是全匹配,apropos是關鍵字匹配。比如,manager這個詞,如果「whatis man」,就匹配不到,但apropos man則能夠匹配到。

sysconf函式用來查詢執行時的權能。比如,對傳遞給乙個新程式的字串引數的長度進行限制,可以保護系統不被任意分配記憶體的要求所破壞。比如下面**:

#include

#include

main()

使用uname函式。

下面是一段測試**,**破壞了三種記憶體區域: l

malloc從動態記憶體池中分配的記憶體 l

在程式堆上分配的本地變數 l

在程式啟動時候被靜態分配的並儲存在分散記憶體區域中的全域性變數

#include

#include

#include

char global[5];

int broken(void)

int main(void)

儘管從**中已經發現問題,但實際上程式執行得很好。下面是結果。

為了發現問題,需要借助除錯工具:

malloc_check_,工具用於進行堆資料結構得一致性檢查。有幾種除錯引數:

malloc_check_=0 ./broken

malloc_check_=1 ./broken

malloc_check_=2 ./broken

最有用的是最後一句,一旦發現錯誤,工具將把我們帶到錯誤發生點最近的地方。

這樣用則更好:

$ malloc_check_2 gdb ./broken

下面是部分除錯資訊:

gnu gdb red hat linux (5.3post-0.20021129.18rh)

gdb is free software, covered by the gnu general public licen se, and you are

welcome to change it and/or distribute copies of it under cer tain conditions.

type "show copying" to see the conditions.

there is absolutely no warranty for gdb. type "show warranty " for details.

this gdb was configured as "i386-redhat-linux-gnu"...

(gdb) r

starting program: /home/lx/csource/bugtest/broken

1: 12345

program received signal sigabrt, aborted.

0xffffe002 in ?? ()

(gdb) where

#0 0xffffe002 in ?? ()

#1 0x42028a73 in abort () from /lib/tls/libc.so.6

#2 0x42075e09 in free_check () from /lib/tls/libc.so.6

#3 0x42073485 in free () from /lib/tls/libc.so.6

#4 0x0804840b in broken ()

#5 0x08048500 in main ()

#6 0x42015574 in __libc_start_main ()

from /lib/tls/libc.so.6

(gdb)

[lx@ssss bugtest]$ gcc -ggdb -o broken broken.c -lmcheck

[lx@ssss bugtest]$ ./broken

1: 12345

memory clobbered past end of allocated block

mcheck只能列印錯誤資訊,並不能指明錯誤所在,因此需要在gdb內執行程式。

帶奇數的核心版本(即2.3、2.5、2.7 等)是實驗性的開發版核心。穩定的發行版核心的版本號是偶數(即2.4、2.6、2.8 等)。

=待續=

Linux程式設計學習二

c 語言看的差不多了,linux程式設計從 入手呢?首先我們要了解一些基本的知識,比如庫檔案,shell程式設計。靜態庫檔案 a 缺點 同一時間執行多個程式而它們又來自同乙個函式庫裡的函式時,記憶體中就會存在同一函式的多份 拷貝,在程式文字中也存在多份拷貝,浪費記憶體和硬碟 建立乙個自己的靜態庫檔案...

Linux程式設計學習筆記(二)

續上個章節,這個章節主要是linux的遠端登入系統操作筆記 一 linux一般作為伺服器使用,但是伺服器都是在機房的,所以不可能經常跑到機房去作業系統,所以使用遠端登入系統,在linux的系統一般使用的是ssh 服務預設埠號是22,在windows上的linux遠端登入客戶端有securecrt p...

Linux學習之shell程式設計二

shell script 的預設變數 0,1.代表後接的引數個數 代表 1,2,3,4之意 代表 1c 2c 3c 4 其中c為分隔符,預設為空格 shift 可以偏移變數號碼,比如shift 或者shift 2可以將變數 向左移動1次或2次 bin bash filename shell05.sh...