國嵌linux視頻課件整理(1)

 Linux系統管理linux

Linux與Linux之間經過NFS(network file system)實現共享;
windows與windows之間經過共享目錄實現共享;
Linux與windows之間經過Samba實現共享。
Wireshark抓包軟件,分析網絡協議。
shell編程:
1)#!/bin/bash ,符號#!用來指定該腳本文件的解析程序。
2)# 開頭表示該行是註釋。
3)全部變量都是由字符串組成,而且不須要預先對變量進行聲明。使用變量需在變量名前$。有時候變量名很容易與其餘文字混淆,這時須要用{}將變量名括起來。
4)默認變量:
$#:傳入腳本的命令行參數個數
$*:全部命令行參數值,在各個參數之間留有空格
$0:命令自己(shell文件名)
$1:第一個命令行參數
$2:第二個命令行參數
5)局部變量,在變量首次賦值時加local能夠聲明一個局部變量。
6)變量注意事項:
變量賦值時「=」號左右兩邊都不能空格
語句結尾不加「;」
7)if語句
if [ expression ]
then
#code block
fi 
if [ expression ]
then
#code block
else
#code block
fi
比較操做 整數 字符串
相同 -eq =
不一樣 -ne !=
大於 -gt >
小於 -lt <
小於等於 -le 
大於等於 -ge
爲空 -z
不爲空 -n 
注意:
在「[」和「]」符號的左右都留有空格
「=」左右都有空格
判斷:
-e 文件已經存在
-f 文件是普通文件
-s 文件大小不爲0
-d 文件是一個目錄
-r 文件對當前用戶能夠讀取
-w 文件對當前用戶能夠寫入
-x 文件對當前用戶能夠執行
8)for循環和while循環
for var in [list]
do
# code
done
注意:
for所在那行變量是沒有加「$」的,而在循環體內,變量是要加「$」的
list若是用「」括起來是被看成一個值賦給var
while [ condition ]
do
#code
done
until [ condition ] 條件爲假時執行
do
#code
done
9)case語句
case "$var" in
condition1)
;;
condition2)

;;
*)
#default statments;;
esac程序員

gcc學習算法

Linux系統下的gcc(GNU C Compiler)是GNU推出的功能強大、性
能優越的多平臺編譯器,是GNU的表明做之一。gcc能夠在多種硬體平臺上編譯出可執行程序,其執行效率與通常的編譯器相比平均效率要高20%~30%。
GCC編譯器能將C,C++語言源程序,彙編程序編譯,連接成可執行文件。Linux經過屬性來決定文件的可執行性。
GCC編譯4個階段:
預處理(pre-processing),編譯(compling),彙編(assembing),
連接(linking)
處理的輸入文件類別:.c.a.C.h.i.ii.o.s.S
gcc最基本的用法是:
gcc [options] [filename]
options:
-o output_filename:指定輸出的可執行文件名稱。
-c:只編譯,不鏈接成爲可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o爲後綴的目標文件。
-g:產生調試工具(GNU的gdb)所必要的符號信息,要想對編譯出的程序進行調試,就必須加入這個選項。
-O:對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、鏈接過程當中進行優化處理,這樣產生的可執行文件的執行效率能夠提升,可是,編譯、鏈接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、鏈接,固然整個編譯、鏈接過程會更慢。
-I dirname: 將dirname所指出的目錄加入到程序頭文件目錄列表
中。C程序中的頭文件包含兩種狀況∶
#include <A.h>和#include 「B.h」對於<>,預處理程序cpp在系統預設的頭文件目錄(如/usr/include)中搜尋相應的文件;而對於」」,cpp在當前目 錄中搜尋頭文件。這個選項的做用是告訴cpp,若是在當前目錄
中沒有找到須要的文件,就到指定的dirname目錄中去尋找。
-L dirname:將dirname所指出的目錄加入到庫文件的目錄列表中。在默認狀態下,鏈接程序ld在系統的預設路徑中(如/usr/lib)尋找所須要的庫文件,這個選項告訴鏈接程序,首先到-L指定的目錄中去尋找,而後再到系統預設路徑中尋找。
-l name:在鏈接時,裝載名字爲「libname.a」的函數庫,該函數庫位於
系統預設的目錄或者由-L選項肯定的目錄下。例如,-l m表示鏈接名爲
「libm.a」的數學函數庫。
-static:靜態連接庫文件 例:gcc –static hello.c -o hello
庫有動態與靜態兩種,動態一般用.so爲後綴,靜態用.a爲後綴。例如:libhello.so libhello.a。當使用靜態庫時,鏈接器找出程序所需的函數,而後將它們拷貝到可執行文件,一旦鏈接成功,靜態程序庫也就再也不須要了。然 而,對動態庫而言,就不是這樣,動態庫會在執行程序內留下一個標記‘指明當程序執行時,首先必須載入這個庫。因爲動態庫節省空間,linux下進行鏈接的 缺省操做是首先鏈接動態庫。
-Wall:生成全部警告信息
-w:不生成任何警告信息
-DMACRO: 定義 MACRO 宏,等效於在程序中使用#define MACRO
shell

 

GDB程序調試express

GDB是GNU發佈的一款功能強大的程序調試工具。GDB主要完成下面三個方面的功能:編程

一、啓動被調試程序。windows

二、讓被調試的程序在指定的位置停住。數組

三、當程序被停住時,能夠檢查程序狀態bash

(如變量值)。網絡

GDB調試的通常步驟:

1.編譯生成可執行文件:

gcc -g tst.c -o tst

2.啓動GDB

gdb tst

3. 在main函數處設置斷點

break main

4. 運行程序

run

5. 單步運行

next

6. 繼續運行

continue

經常使用GDB命令:

list(l) 查看程序

break(b) 函數名 在某函數入口處添加斷點

break(b) 行號 在指定行添加斷點

break(b) 文件名:行號在指定文件的指定行添加斷點

break(b) 行號 if 條件當條件爲真時,指定行號處斷點生效,例b 5 if i=10,當i等於10時第5行斷點生效

info break 查看全部設置的斷點

delete 斷點編號 刪除斷點

run(r) 開始運行程序

next(n) 單步運行程序(不進入子函數)

step(s) 單步運行程序(進入子函數)

continue(c) 繼續運行程序

print(p) 變量名 查看指定變量值

finish 運行程序,直到當前函數結束

watch 變量名 對指定變量進行監控

quit(q) 退出gdb

 

Makefile工程管理

Linux程序員必須學會使用GNU make來構建和管理本身的軟件工程。GNU 的make可以使整個軟件工程的編譯、連接只須要一個命令就可

以完成。

make在執行時, 須要一個命名爲Makefile的文件。Makefile文件描述了整個工程的編譯,鏈接等規則。其中包括:工程中的哪些源文件須要編譯以及如何編譯;須要建立那些庫文件以及如何建立這些庫文件、如何最後產生咱們想要得可執行文件。

makefile規則:用於說明如何生成一個或多個目標文件,

規則格式以下:

targets :prerequisites

command

目標 依賴 命令

main.o : main.c

gcc –c main.c

**命令須要以【TAB】鍵開始**

目標:在Makefile 中,規則的順序是很重要的,由於,Makefile中只應該有一個最終目標,其它的目標都是被這個目標所連帶出來的,因此必定要讓make知道你的最終目 標是什麼。通常來講,定義在Makefile中的目標可能會有不少,可是第一條規則中的目標將被確立爲最終的目標。

文件名:make命令默認在當前目錄下尋找名字爲makefile或者Makefile的工程文件,當名字不爲這二者之一時,可使用以下方法指定:

make –f 文件名

僞目標:Makefile中把那些沒有任何依賴只有執行動做的目標稱爲「僞目標」(phony targets)。

.PHONY : clean

clean :

rm –f hello main.ofunc1.o func2.o

「.PHONY」 將「clean」目標聲明爲僞目標。

變量的使用:obj=main.o func1.o func2.o func3.o

hello: $(obj)

gcc $(obj) -o hello

在makefile中,存在系統默認的自動化變量

$^:表明全部的依賴文件

$@:表明目標

$<:表明第一個依賴文件

Makefile中「#」字符後的內容被視做註釋。

@:取消回顯

hello: hello.c

@gcc hello.c –ohello

 

linux文件編程

Linux系統調用

系統調用-建立

int creat(const char*filename,mode_t mode)

vfilename:要建立的文件名(包含路徑,缺省爲當前路徑)

vmode:建立模式,常見建立模式:

S_IRUSR 可讀

S_IWUSR 可寫

S_IXUSR 可執行

S_IRWXU 可讀、寫、執行

除了可使用上述宏之外,還能夠直接使用數字來表示文件的訪問權限:

v可執行 -> 1

v可寫 -> 2

v可讀 -> 4

v上述值的和,如可寫可讀 -> 6

v無任何權限 -> 0

文件描述

在Linux系統中,全部打開的文件都對應一個文件描述符。文件描述符的本質是一個非負整數。當打開一個文件時,該整數由系統來分

配。文件描述符的範圍是0 - OPEN_MAX 。早期的UNIX版本OPEN_MAX =19,即容許每一個進程同時打開20個文件,如今不少系統則將其增長至1024。

系統調用-打開

int open(const char*pathname, int flags)

int open(const char*pathname, int flags,mode_t mode)

pathname:要打開的文件名(包含路徑,缺省爲當前路徑)

flags:打開標誌,常見的打開標誌:

O_RDONLY 只讀方式打開

O_WRONLY 只寫方式打開

O_RDWR 讀寫方式打開

O_APPEND 追加方式打開

O_CREAT 建立一個文件

O_NOBLOCK 非阻塞方式打開

若是使用了O_CREATE標誌,則使用的函數是:

int open(const char*pathname,int flags,mode_t mode);

這時須要指定mode來表示文件的訪問權限。

當咱們操做完文件之後,須要關閉文件:

int close(int fd) ,fd: 文件描述符

系統調用-讀

int read(int fd,const void *buf, size_t length)

功能:從文件描述符fd所指定的文件中讀取length個字節到buf所指向的緩衝區中,返回值爲實際讀取的字節數。

系統調用-寫

int write(int fd,const void *buf, size_t length)

功能:把length個字節從buf指向的緩衝區中寫到文件描述符fd所指向的文件中,返回值爲實際寫入的字節數。

系統調用-定位

int lseek(int fd,offset_t offset, int whence)

功能:將文件讀寫指針相對whence移動offset個字節。操做成功時,返回文件指針相對於文件頭的位置。

whence可以使用下述值:

SEEK_SET:相對文件開頭

SEEK_CUR:相對文件讀寫指針的當前位置

SEEK_END:相對文件末尾

offset可取負值,表示向前移動。例以下述調用可將文件指針相對當前位置向前移動5個字節:

lseek(fd, -5,SEEK_CUR)

因爲lseek函數的返回值爲文件指針相對於文件頭的位置,所以下面調用的返回值就是文件的長度:

lseek(fd, 0,SEEK_END)

系統調用-訪問判斷

有時咱們須要判斷文件是否能夠進行某種操做(讀,寫

等),這時可使用access函數:

int access(constchar*pathname,int mode)

pathname:文件名稱

mode:要判斷的訪問權限。能夠取如下值或者是他們的組合。R_OK:文件可讀,W_OK:文件可寫,X_OK:文件可執行,F_OK文件存在。

返回值:當咱們測試成功時,函數返回0,不然若是一個條件不符時,返回-1。

C語言庫函數

C庫函數的文件操做是獨立於具體的操做系統平臺的,無論是在DOS、Windows、Linux仍是在VxWorks中都是這些函數。

庫函數-建立和打開

FILE *fopen(constchar *filename, const char *mode)

filename:打開的文件名(包含路徑,缺省爲當前路徑)

mode:打開模式

常見打開模式:

r, rb 只讀方式打開

w, wb 只寫方式打開,若是文件不存在,則建立該文件

a, ab 追加方式打開,若是文件不存 在,則建立該文件

r+, r+b, rb+讀寫方式打開

w+, w+b, wh+ 讀寫方式打開,若是文件不存在,則建立該文件

a+, a+b, ab+讀和追加方式打開。若是文件不存在,則建立該文件

b用於區分二進制文件和文本文件,這一點在DOS、Windows系統中是有區分的,但Linux不區分二進制文件和文本文件。

庫函數-讀

size_t fread(void*ptr, size_t size, size_t n, FILE *stream)

功能:從stream指向的文件中讀取n個字段,每一個字段爲size字節,並將讀取的數據放入ptr所指的字符數組中,返回實際已讀取的字節數。

庫函數-寫

size_t fwrite (constvoid *ptr, size_t size, size_t n,FILE *stream)

功能:從緩衝區ptr所指的數組中把n個字段寫到stream指向的文件中,每一個字段長爲size個字節,返回實際寫入的字段數。

庫函數-讀字符

int fgetc(FILE*stream)

庫函數-寫字符

int fputc(int c,FILE *stream)

庫函數-格式化讀

fscanf(FILE *stream,char *format[,argument...])

從一個流中進行格式化輸入,fscanf(stdin, "%d", &i)

庫函數-格式化寫

int fprintf(FILE*stream, char* format[,argument,...])

格式化輸出到一個流中,printf( stream, "%d\n", i );

庫函數-定位

int fseek(FILE*stream, long offset, int whence)

whence :

SEEK_SET 從文件的開始處開始搜索

SEEK_CUR 從當前位置開始搜索

SEEK_END 從文件的結束處開始搜索

路徑獲取

在編寫程序的時候,有時候須要獲得當前路徑。C庫函數提供了getcwd來解決這個問題。

char *getcwd(char*buffer,size_t size)

咱們提供一個size大小的buffer,getcwd會把當前的路徑名copy 到buffer中.若是buffer過小,函數會返回-1。

建立目錄

#include<sys/stat.h>

int mkdir(char *dir, int mode)

功能:建立一個新目錄。

返回值:0表示成功,-1表述出錯。

 

linux時間編程

時間類型

CoordinatedUniversal Time(UTC):世界標準時間,也就是你們所熟知的格林威治標準時間(Greenwich Mean Time,GMT)。

Calendar Time:日曆時間,是用「從一個標準時間點(如:1970年1月1日0點)到此時通過的秒數」來表示的時間。

時間獲取

#include<time.h>

time_t time(time_t*tloc)

功能:獲取日曆時間,即從1970年1月1日0點到如今所經歷的秒數。

/* typedef longtime_t */

時間轉化

struct tm*gmtime(const time_t *timep)

功能:將日曆時間轉化爲格林威治標準時間,並保存至TM結構。

struct tm*localtime(const time_t *timep)

功能:將日曆時間轉化爲本地時間,並保存至TM結構。

時間保存

struct tm {

int tm_sec; //秒值

int tm_min;

//分鐘值

int tm_hour; //小時值

int tm_mday; //本月第幾日

int tm_mon;

//本年第幾月

int tm_year;//tm_year + 1900 = 哪一年

int tm_wday; //本週第幾日

int tm_yday; //本年第幾日

int tm_isdst; //日光節約時間

};

時間顯示

char *asctime(conststruct tm *tm)

功能:將tm格式的時間轉化爲字符串,如: Sat Jul 30 08:43:03 2005

char *ctime(consttime_t *timep)

功能:將日曆時間轉化爲本地時間的字符串形式。

獲取時間

intgettimeofday(struct timeval *tv,struct timezone *tz)

功能:獲取從今日凌晨到如今的時間差,經常使用於計算事件耗時。

struct timeval {

int tv_sec; //秒數

int tv_usec; //微妙數

};

延時執行

unsigned intsleep(unsigned int seconds)

功能:使程序睡眠seconds秒。

void usleep(unsignedlong usec)

功能:使程序睡眠usec微秒。

進程控制

進程控制理論

定義:

進程是一個具備必定獨立功能的程序的一次運行活動。

特色:

動態性

併發性

獨立性

異步性

狀態

進程ID

進程ID(PID):標識進程的惟一數字

父進程的ID(PPID)

啓動進程的用戶ID(UID)

進程互斥

進程互斥是指當有若干進程都要使用某一共享資源時,任什麼時候刻最多容許一個

進程使用,其餘要使用該資源的進程必須等待,直到佔用該資源者釋放了該資源

爲止。

臨界資源

操做系統中將一次只容許一個進程訪問的資源稱爲臨界資源。

臨界區

進程中訪問臨界資源的那段程序代碼稱爲臨界區。爲實現對臨界資源的互斥訪

問,應保證諸進程互斥地進入各自的臨界區。

進程同步

一組併發進程按必定的順序執行的過程稱爲進程間的同步。具備同步關係

的一組併發進程稱爲合做進程,合做進程間互相發送的信號稱爲消息或事件。

進程調度

概念:

按必定算法,從一組待運行的進程中選出一個來佔有CPU運行。

調度方式:

• 搶佔式

• 非搶佔式

調度算法:

先來先服務調度算法

短進程優先調度算法

高優先級優先調度算法

時間片輪轉法

死鎖

多個進程因競爭資源而造成一種僵局,若無外力做用,這些進程都將永

遠不能再向前推動。

進程建立

獲取ID

#include<sys/types.h>

#include<unistd.h>

pid_t getpid(void) 獲取本進程ID。

pid_t getppid(void) 獲取父進程ID。

進程建立-fork

#include<unistd.h>

pid_t fork(void)

功能:建立子進程

fork的奇妙之處在於它被調用一次,卻返回兩次,它可能有三種不一樣的返回值:

1. 在父進程中,fork返回新建立的子進程的PID;

2. 在子進程中,fork返回0;

3. 若是出現錯誤,fork返回一個負值

在pid=fork()以前,只有一個進程在執行,但在這條語句執行以後,就變成兩個

進程在執行了,這兩個進程的共享代碼段,將要執行的下一條語句都是if(pid==0)。

兩個進程中,原來就存在的那個進程被稱做「父進程」,新出現的那個進程被稱做「子進程」,父子進程的區別在於進程標識符(PID)不一樣。

子進程的數據空間、堆棧空間都會從父進程獲得一個拷貝,而不是共享。在子

進程中對count進行加1的操做,並無影響到父進程中的count值,父進程中的

count值仍然爲0。

進程建立-vfork

#include<sys/types.h>

#include<unistd.h>

pid_t vfork(void)

功能:建立子進程。

區別:

1. fork:子進程拷貝父進程的數據段

vfork:子進程與父進程共享數據段

2. fork:父、子進程的執行次序不肯定

vfork:子進程先運行,父進程後運行

exec函數族

exec用被執行的程序替換調用它的程序。

區別:

fork建立一個新的進程,產生一個新的PID。exec啓動一個新程序,替換原有的進程,所以進程的PID不會改變。

#include<unistd.h>

intexecl(const char * path,const char * arg1, ....)

參數:

path:被執行程序名(含完整路徑)。

arg1 – argn: 被執行程序所需的命令行參數,含程序名。以空指針(NULL)結束。

例:execl.c

#include<unistd.h>

main()

{

execl(「/bin/ls」,」ls」,」-al」,」/etc/passwd」,(char* )0);

}

#include<unistd.h>

intexeclp(const char * path,const char * arg1, ...)

參數:

path:被執行程序名(不含路徑,將從path環境變量中查找該程序)。

arg1 – argn: 被執行程序所需的命令行參數,含程序名。以空指針(NULL)結束。

例:execlp.c

#include<unistd.h>

main()

{

execlp(」ls」,」ls」,」-al」,」/etc/passwd」,(char*)0);

}

#include<unistd.h>

int execv(const char * path, char * const argv[ ])

參數:

path:被執行程序名(含完整路徑)。

argv[]: 被執行程序所需的命令行參數數組。

例:execv.c

#include<unistd.h>

main()

{

char * argv[]={「ls」,」-al」,」/etc/passwd」,(char*)0};

execv(「/bin/ls」,argv);

}

#include<stdlib.h>

intsystem( const char* string )

功能:

調用fork產生子進程,由子進程來調用/bin/sh -c string來執行參數string所表明

的命令。

例:system.c

#include<stdlib.h>

void main()

{

system(「ls -al/etc/passwd」);

}

進程等待

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait (int *status)

功能:阻塞該進程,直到其某個(任意)子進程退出。

 

進程通訊

概述

爲何進程間須要通訊?

一、數據傳輸

一個進程須要將它的數據發送給另外一個進程。

二、資源共享

多個進程之間共享一樣的資源。

三、通知事件

一個進程須要向另外一個或一組進程發送消息,通知它們發生了某種事件。

四、進程控制

有些進程但願徹底控制另外一個進程的執行(如Debug進程),此時控制進程但願可以攔截另外一個進程的全部操做,並可以及時知道它的狀態改變。

Linux進程間通訊(IPC)由如下幾部分發展而來:

一、UNIX進程間通訊

二、基於System V進程間通訊

三、POSIX進程間通訊

POSIX(PortableOperating System Interface)表示可移植操做系統接口。電氣和電子工程師協會(Institute of Electrical and ElectronicsEngineers,IEEE)最初開發 POSIX 標準,是爲了提升 UNIX 環境下應用程序的可移植性。然而,POSIX 並不侷限於 UNIX,許多其它的操做系統,例如 DEC OpenVMS 和 Microsoft Windows,都支持 POSIX 標準。

System V,也被稱爲 AT&T System V,是Unix操做系統衆多版本中的一支。

如今Linux使用的進程間通訊方式包括:

一、管道(pipe)和有名管道(FIFO)

二、信號(signal)

三、消息隊列

四、共享內存

五、信號量

六、套接字(socket)

管道通訊

什麼是管道?

管道是單向的、先進先出的,它把一個進程的輸出和另外一個進程的輸入鏈接在一塊兒。一個進程(寫進程)在管道的尾部寫入數據,另外一個進程(讀進程)從管道的頭部讀出數據。

數據被一個進程讀出後,將被從管道中刪除,其它讀進程將不能再讀到這些數據。管道提供了簡單的流控制機制,進程試圖讀空管道時,進程將阻塞。一樣,管道已經滿時,進程再試圖向管道寫入數據,進程將阻塞。

管道建立

管道包括無名管道和有名管道兩種,前者用於父進程和子進程間的通訊,後者可用於運行於同一系統中的任意兩個進程間的通訊。

無名管道由pipe()函數建立:

int pipe(int filedis[2]);

當一個管道創建時,它會建立兩個文件描述符:filedis[0] 用於讀管道, filedis[1] 用於寫管道。

關閉管道只需將這兩個文件描述符關閉便可,可使用普通的close函數逐個關閉。

管道讀寫

管道用於不一樣進程間通訊。一般先建立一個管道,再經過fork函數建立一個子進程,該子進程會繼承父進程所建立的管道。

注意事項

必須在系統調用fork( )前調用pipe( ),不然子進程將不會繼承文件描述符。

命名管道(FIFO)

命名管道和無名管道基本相同,但也有不一樣點:無名管道只能由父子進程使用;可是經過命名管道,不相關的進程也能交換數據。

建立

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(constchar * pathname, mode_t mode)

pathname:FIFO文件名

mode:屬性(見文件操做章節)

一旦建立了一個FIFO,就可用open打開它,通常的文件訪問函數(close、read、write等)均可用於FIFO。

操做

當打開FIFO時,非阻塞標誌(O_NONBLOCK)將對之後的讀寫產生以下影響:

一、沒有使用O_NONBLOCK:訪問要求沒法知足時進程將阻塞。如試圖讀取空的FIFO,將致使進程阻塞。

二、使用O_NONBLOCK:訪問要求沒法知足時不阻塞,馬上出錯返回,errno是ENXIO。

相關文章
相關標籤/搜索