linux程序 學習總結

2021-10-06 18:56:49 字數 1977 閱讀 6642

學習檔案之後,緊接著學習程序的相關知識,這一章主要也是一些api的操作學習。

首先程序是什麼啊,應該是某一執行某乙個程式吧,就先這樣理解吧

1.獲取程序描述符getpid()

man手冊:

#include

#include

pid_t getpid(void);

pid_t getppid(void);

操作:pid_t pid;//定義

pid = getpid();//獲取

注:同檔案描述符一樣,程序的這個描述符也是貫穿程序,走哪都有,它是程序的id一樣。

2.建立子程序fork() 非常重要

#include

pid_t fork(void);

操作:pid = fork(); //fork返回兩個引數,非負數(子程序的pid)代表父程序,0代表子程序;

當建立完子程序後,父程序和子程序會一起往下執行後面的命令,這是時而父先時而子先,二者交替,這是在爭奪cpu資源。

vfork()

子程序先執行,不會複製父程序的記憶體空間,退出後父程序再繼續執行;類似於寫時拷貝,記憶體是共享的,只有修改時才時拷貝。

補充:linux記憶體狀態圖

主體**都存放在正文中,初始化過的資料,未初始化的資料。堆裡面存放的是malloc申請的記憶體空間,棧裡是函式呼叫相關操作。

3.等待退出wait()和exit()

若要求父程序等待子程序先執行,之後其再執行,則用wait()api

#include

#include

pid_t wait(int *status);

4.exec族api

這個api可有點來頭,可以通過它呼叫其他程序,你看厲害不

#include

int execl(const char *path, const char arg, …/ (char *) null */);

int execlp(const char *file, const char arg, … / (char *) null */);

int execv(const char *path, char *const ar**);

int execvp(const char *file, char *const ar**);

操作:execl("/bin/date",「date」,null,null)這句指令可以呼叫linux裡bin目錄下的data程式看系統時間。

下面介紹乙個fork和execl結合起來實現修改檔案的例子:

./changedata為上一章檔案中revise.c生成的可執行檔案

execlp與execl的區別是,前者不許寫具體路徑,可以幫忙直接找到需要呼叫的程式:

execlp(「date」,「date」,null,null);

char *ar** = ;

execvp(「ps」,ar**);

5.system()

#include

int system(const char *command);

system函式是對execl的封裝,簡化了呼叫函式

操作:system(「date」);

popen比system更高階一些,它可以讀取開啟檔案的內容,返回值是乙個流,因此需要用fread來讀取它。

linux學習總結程序與執行緒

程序的概念 程序是乙個獨立的可排程的任務。是乙個程式一次執行的過程。程式是靜態的,是儲存在磁碟上的指令的有序集合,沒有執行的概念。程序是動態的 他是程式執行的過程,包括建立 排程 消亡,是程式執行的各種資源的總和,是資源管理的最小單位。程序包括 正文段 使用者資料段 系統資料段 程序控制塊pcb 程...

linux 程序通訊 訊號學習總結(1)

liux 下程序通訊有訊號 管道和system v 的ipc的三種通訊方式 訊號量 訊息佇列以及共享記憶體。訊號在linux通訊方式中是一種最簡單的通訊方式,它只傳送簡單的資料,實際上是一種非同步軟中斷的通訊方式。linux的訊號有很多,其中最常用的有sigkill sigalrm sigstop ...

Linux學習 程序

1.程序定義 程序就是cpu未完成的工作 2.ps檢視命令 ps a 關於當前環境的所有程序 ps x a 所有程序 ps f 顯示程序從屬關係 ps e 顯示程序呼叫環境工具的詳細資訊 ps l 長列表顯示程序的詳細資訊 ps u 顯示程序的使用者資訊 ps a 顯示shell前台執行命令的程序,...