Linux程序程式設計

2021-09-12 04:01:27 字數 2594 閱讀 5165

程序是作業系統中最基本、最重要的概念,可以說程序是作業系統結構的基礎。作業系統上任何程式的執行都離不開程序。

1.程序的概念

傳統的程式本是一組指令的集合,是乙個靜態實體,無法描述程式在記憶體中的執**況,也就不能如實反映程式併發執行過程的特徵,為了深刻描述程式動態執行過程的性質,人們就引入了「程序」的概念。 程序在系統中表現為一種資料結構,實現對正在執行的程式過程的抽象,其中程序由三個部分組成:

程序的主要特徵:

由於程序執行時的時間間斷性,執行中的程序可能有三種基本狀態:

linux排程器將程序分為三種不同型別,每種程序都有自己的特點和屬性:

2.程序的操作

在linux系統中定義了一系列的程序操作函式,包括程序的建立、排程、終止等。

1. 程序的建立

乙個程序建立了子程序,其中建立子程序的程序我們稱為父程序,除了建立與被建立之外,父程序與子程序之間的關係也是管理與被管理的關係。

linux系統啟動時處於核心模式,此時只有乙個程序:初始化程序(init程序),其程序號為1,linux系統中的所有程序都是由init程序直接或間接建立的。

程式可以通過getpid()獲得自身所執行的程序id,也可以通過getppid()獲取父程序的id。建立程序時,通過函式fork()

2.程序的排程sched.h

linux系統核心中有乙個程序控制表,程序控制表每一項都是乙個task_struct結構,即代表了乙個程序。linux內雖然程序都是動態分配的,但還是需要考慮最大程序數。在系統中,預設的最大程序數是512,即表示系統中可同時容納的程序個數為512個。

linux管理程序的最好方法是使用命令來管理,主要涉及的命令有ps at top kill pstree nice renice等。

3. 程序的終止

子程序一旦被建立,就與其父程序一起被系統進行排程,子程序執行完畢後,並不立即釋放所占有的所有程序控制表項,而是作為殭屍程序存在於系統中,直到父程序正常退出或呼叫wait()函式,子程序才徹底終止。

pid-t wait(int *status);

pdi_t waitpid(pid_t pid, int *status, int options);

options:

wnohang--要求如果沒有子程序退出就立即返回

wuntraced--對已經停止但為報告狀態的子程序

該呼叫也從等待中返回和報告狀態,如果status不為空,呼叫將使status指向該資訊。

呼叫了wait()函式的父程序會馬上阻塞自己,由wait()函式自動分析是否當前程序的某乙個子程序已經退出,如果找到了這樣乙個殭屍程序,wait()函式就會收集這個子程序的資訊,將它徹底終止並返回子程序的結束狀態,如果沒有找到這樣乙個子程序,wait()函式就會一直阻塞在這裡,直到找到乙個變成殭屍程序的子程序出現為止,但如果父程序還未呼叫wait()函式就終止了,此時子程序就將被init程序接管,它將控制子程序退出後必須的清除工作。

3.程序間的通訊systemv posix

在同一臺計算機中的程序相互通訊的方式主要有:管道(pipe)、訊號(signal)、訊號量(semaphore)、訊息佇列(message)、共享記憶體(shared memory),其中訊號量、訊息佇列、共享記憶體被稱為ipc機制。不同機器之間的程序通訊可以使用套接字技術。

1.管道

管道是ipc機制中的最老形式,是程序直接進行資料交換的通道,並且所有unix系統都提供了這種通訊機制,管道分為普通管道和命名管道。它們都是通過核心緩衝區按照先進先出的方式進行資料傳輸,其普通管道的特點為:

管道的建立和讀寫

無名管道

#include 建立管道:int pipe(int pipefd[2]);

pipe[0]-->讀資料

pipe[1]-->寫資料

命名管道

建立管道:int mkfifo(const char *pathname, mode_t mode);
一般檔案的i/o操作函式都可以用於管道。

close(fd);

int read(fd, buffer, len);

int write(fd, buffer, len);

2.訊號signal()

訊號是的一種重要的程序方式,類似於中斷機制,由某些錯誤條件而產生的事件,如果不指定,系統會呼叫預設操作來處理訊號,大部分訊號的預設操作將會終止程序。程序可以指定處理函式,由該函式處理,也可以忽略某個訊號,對該訊號不做任何處理,就像未發生過一樣。

signal函式的原型

void (*signal(int signum, void (* handler) (int))) (int)

對於訊號的操作,一般步驟為:安裝訊號,實現訊號處理函式,傳送訊號,訊號的生命週期從傳送訊號開始,到相應的處理函式執行完畢後結束。

Linux程序程式設計

一 與程序相關的系統函式 1.getpid include 提供pid t型別的定義 include 提供函式的定義 pid t getpid void 返回值為當前程序的程序id 2.getppid include 提供pid t型別的定義 include 提供函式的定義 pid getppid ...

Linux 程序程式設計

程序程式設計 1 getpid 函式的作用 獲取程序的識別碼 程序號 函式的原型 pid t getpid void 返回值 目前程序的程序號 標頭檔案 include 2 fork 函式的作用 建立乙個程序 函式的原型 pid t fork void 函式的返回值 0 出錯 0 表示當前建立的是子...

Linux 程序程式設計

特點 wait waitpid 殭屍程序 特點 pid t waitpid pid t pid,int status,options 使用pipe 使用方便 兩個程序中,其中乙個程序讀取管道 使用pipe函式構建父子關係,呼叫ls l grep a.out demo c int main int i...