Linux系統程式設計之程序
1、程序控制塊=程序描述符(PCB)
程序狀態(4/5種):就緒(初始化),執行,掛起(=等待), 停止
PBC成員:
1、程序id
2、程序狀態
3、程序切換需要儲存和恢復的CPU暫存器
4、描述虛擬地址空間資訊
5、描述控制終端的資訊
6、當前工作目錄
7、umask掩碼
8、檔案描述符
9、訊號相關的資訊
10、使用者和使用者組id
11、會話(session)和程序組
12、資源使用上限(命令ulimit -a, 檢視資源上限值)
2、環境變數
2.1 環境變數
環境變數,是指在作業系統中用來指定作業系統執行環境的一些引數。通常具備以下特徵:
① 字串(本質) ② 有統一的格式:名=值[:值] ③ 值用來描述程序環境資訊。
2.1、環境變數
在libc庫中使用外部名變數:environ獲取當前系統全部的系統變數。
2.2、獲取和設定環境變數
獲取環境變數介面名稱:
#include <stdlib.h>
/*
param:
name: 表示環境變數名稱
*/
char *getenv(const char *name);
設定和取消環境變數
#include <stdlib.h>
/*
param:
name: 環境變數名
value: 環境變數
rewrite:0:不覆蓋,非0:覆蓋
*/
int setenv(const char* name, const char *value, int rewrite);
/*
param:
name:環境變數名
*/
void unsetenv(const char *name);
例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *path = getenv("PATH"); //獲取環境變數
printf("PATH:%s\n", path);
setenv("PATH", "hello", 0); //0:不覆蓋之前,非0:覆蓋
printf("PATH:%s\n", getenv("PATH"));
unsetenv("PATH" ); //刪除環境變數
return 0;
}
程序控制
建立程序:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int var = 34;
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0 ) { //出錯
perror("fork");
exit(1);
} else if (pid > 0) { //父程序
sleep(2);
var = 55;
printf("I'm parent pid = %d, parentID = %d, var = %d\n", getpid(), getppid(), var);
} else if (pid == 0) { //子程序
var = 100;
printf("child pid = %d, parentID=%d, var = %d\n", getpid(), getppid(), var);
}
printf("var = %d\n", var);
return 0;
}
4、如何建立N個程序
簡單想想寫下如下程式碼:
for(int i = 0; i < N; i++){
pid_ t pid = fork();
if(pid > 0){
}else if(pid == 0){
//break;
}else{
}
}
但這樣事實果真如此嗎?上述情況建立程序會建立2^N-1個程序,因為在子程序中還會去建立孫程序,如此子子孫孫建立得不是N個程序。避免已建立的子程序也去建立程序,我們應該在else if(pid == 0)上就break來跳出當前的for迴圈。
5、如何使用GDB除錯多執行緒:
set follow-fork-mode child //切換子程序
set follow-fork-mode father //gdb下預設進入父程序,切換回子程序
在gdb下上面兩個命令實現父程序和子程序的切換
6、防止孤兒程序和僵死程序
孤兒程序:父程序優先於子程序結束,則子程序成為孤兒程序,孤兒程序由init程序管理。
殭屍程序:程序終止,父程序尚未回收,子程序殘留資源(PCB)存放在核心中。
1. 子程序都是通過父程序來回收的。如果父程序先退出子程序還在執行,就會產生孤兒程序。
2. 殭屍程序是不能用kill 命令清除掉的,因為kill 命令只是用來終止程序的,而殭屍程序已經終止了。
子程序回收函式:
#include <sys/types.h>
#include <sys/wait.h>
/*
param:
status:傳出引數
return:
成功:pid, 失敗:-1
功能:1、阻塞等待子程序 2、回收子程序資源 3、獲取程序結束狀態
WIFEXITED(status)=true/false;
WEXITSTATUS(status)獲取子程序退出狀態
WIFSIGNALED(status)=true/false
WTERMSIG(status)獲取終止子程序的訊號編號
*/
pid_t wait(int status);
/*
param:
pid:
pid > 0 指定程序回收
pid =-1 回收任意子程序
pid = 0 回收本組任意子程序
pid <-1 回收該程序組的任意子程序
status: 參考wait()
options: 0:阻塞回收
WNOHANG:非阻塞回收(需要輪詢查)
return:
成功:pid 失敗 -1 返回0:options=WNOHANG,此時子程序未結束
*/
pid_t waitpid(pid_t pid, int *status, int options);
特點:
1. 如果子程序還在執行會阻塞等待。
2. 帶子程序的終止資訊立即返回。
3. 出錯(return -1)立即返回。
區別:
- 如果父程序的所有子程序都還在執行,呼叫wait將使父程序阻塞,而呼叫waitpid時如果在options引數中指定WNOHANG可以使父程序不阻塞而立即返回0。
- wait等待第一個終止的子程序,而waitpid可以通過pid引數指定等待哪一個子程序。
相關推薦
Linux系統程式設計之程序
1、程序控制塊=程序描述符(PCB) 程序狀態(4/5種):就緒(初始化),執行,掛起(=等待), 停止 PBC成員: 1、程序id 2、程序狀態 3、程序切換需要儲存和恢復的CPU暫存器 4、描述虛擬地址空間資訊 5、描述控制終端的資訊 6、當
linux系統程式設計之程序(八):守護程序詳解及建立,daemon()使用
一,守護程序概述 Linux Daemon(守護程序)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要使用者輸入就能執行而且提供某種服務,不是對整個系統就是對某個使用者程式提供服務。Linux系統的大多數伺服器就是通過守護程序實現的。常見的守護程序包括系
linux系統程式設計之程序(四):程序退出exit,_exit區別即atexit函式
一,程序終止有5種方式: 正常退出: 從main函式返回 呼叫exit 呼叫_exit 異常退出: 呼叫abort 由訊號終止 二,exit和_exit區別: 關於_exit(): #include <unistd.h>
linux系統程式設計之程序(一)
本節目標:什麼是程式什麼是程序程序資料結構程序與程式區別與聯絡一,什麼是程式?程式是完成特定任務的一系列指令集合二,什麼是程序?從使用者的角度來看程序是程式的一次動態執行過程從作業系統的核心來看,程序是作業系統分配的記憶體、CPU時間片等資源的基本單位。程序是資源分配的最小單位每一個程序都有自己獨立的地址空間
linux系統程式設計之程序的環境變數
環境變數: 環境變數,是指在作業系統中用來指定作業系統執行環境的一些引數。通常具備以下特徵: ① 字串(本質) ② 有統一的格式:名=值[:值] ③ 值用來描述程序環境資訊。 儲存形式:與命令列引數類似。char *[]陣列,陣列名environ,內部儲存
linux系統程式設計之程序(二):程序生命週期與PCB(程序控制塊)
本節目標: 程序狀態變遷程序控制塊程序建立程序撤消終止程序的五種方法 一,程序狀態變遷 程序的三種基本狀態 就緒(Ready)狀態 當程序已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的程序狀態稱為就緒狀態。 執行(Running)狀態 當程序已獲得
linux系統程式設計-回收程序
孤兒程序和殭屍程序的概念 孤兒程序:父程序先於子程序結束,則子程序成為孤兒程序,此時init程序變成子程序的父程序,稱為init程序領養孤兒程序。 殭屍程序:程序終止,父程序尚未回收,子程序殘留資源(PCB)存放於核心中,變成殭屍(Zombie)程序
Python基礎(八)-系統程式設計之程序--multiprocessing(阻塞非阻塞)
程序擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,程序由作業系統排程。 執行緒擁有自己獨立的棧和共享的堆,共享堆,不共享棧,執行緒亦由作業系統排程(標準執行緒是的)。 協程和執行緒一樣共享堆,不共享棧,協程由程式設計師在協程的程式碼裡顯示排程 multiproces
linux系統程式設計之struct flock 結構體
該結構是在lock.h檔案中定義。 lock.h File 功能 定義一些檔案的鎖的選項 Description The flockstructure in the/usr/include/s
Linux系統程式設計1.程序
1. 程序的概念 Linux作業系統是面向多使用者的,在同一時間可以有許多使用者向作業系統發出各種命令。在現代作業系統中,都有程式和程序的概念。 通俗的講:程式是一個包含可以執行程式碼的檔案,是一個靜態的檔案;而程序是一個開始執行但還沒有結束的程式例
Linux系統程式設計之錯誤處理:perror,strerror和errno
轉自:http://www.linuxidc.com/Linux/2013-07/87238.htm 1,在系統程式設計中錯誤通常通過函式返回值來表示,並通過特殊變數errno來描述。 errno這個全域性變數在<errno.h>標頭檔案中宣告如下:ext
linux系統程式設計:程序原語
程序原語 1. 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。 2. 程序環境 在libc中定義的全域性變數environ指
linux系統程式設計之檔案I/O
一、檔案描述符 linux系統中,所有開啟的檔案都對應一個數字,這個數字由系統來分配,稱為檔案描述符。 PCB程序控制塊裡有檔案描述符表,以陣列形式存放於核心區。 一個程序預設開啟3個檔案描述符 STDIN_FILE
linux系統程式設計之訊號(三):訊號的阻塞與未決
/************************************************************************* > File Name: process_.c > Author: Simba > Mail: [email
學習Linux C程式設計之程序控制程式設計
建立程序 fork fork 的定義 在 Linux 中,我們使用 fork 來建立一個子程序 fork 的返回值 fork 函式有些特殊,成功它返回 2 次,失敗返回 -1,利用這個特性可以判斷當前的程序是子程序還是父程序: 1. 在子程序中返回 0 2.
linux系統程式設計之基礎必備(三):檔案描述符file descriptor與inode的相關知識
每個程序在Linux核心中都有一個task_struct結構體來維護程序相關的 資訊,稱為程序描述符(Process Descriptor),而在作業系統理論中稱為程序控制塊 (PCB,Process Control Block)。task_struct中有一
Linux系統程式設計_程序
程式 vs. 程序: 程式,是指編譯好的二進位制檔案,是靜態概念,在磁碟上,不佔用系統資源(cpu、記憶體、開啟的檔案、裝置、鎖….); 程序,是一個抽象的動態概念,與作業系統原理聯絡緊密。程序是活躍的程式,佔用系統資源。在記憶體中執行。(程式執行起來,產
Linux系統程式設計---程序替換
程序替換 我們知道,在 Windows 平臺下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為一個程序;而在 Linux 平臺,我們可以通過 ./ 執行,讓一個可執行程式成為一個程序。 但是,如果我們本來就執行著一個程式(程序),我們如何在這個程序內部啟動一個外部程式,由核
Linux系統程式設計---程序等待
程序等待 1.為什麼需要程序等待 我們知道,子程序退出,父程序如果不管不顧,那麼子程序就可能變為殭屍程序,進而佔用系統資源,造成記憶體洩漏, 另外,程序一旦變成殭屍狀態,那就刀槍不入,“殺人不眨眼”的kill-9也無能為力,因為誰也辦法殺死一個已經死去的程序。
Linux系統程式設計---程序終止
程序終止 程序的退出有三種場景: 程式碼執行完畢,結果正確 程式碼執行完畢,結果不正確 程式碼異常終止 程序退出方法 從main返回 呼叫exit函式 呼叫_exit函式 ctrl + c :x訊號終止