在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux開發_Linux下進程編程

DS小龍哥-嵌入式技術 ? 2022-09-17 15:38 ? 次閱讀

【摘要】 介紹Linux下進程概念、進程信號捕獲、進程管理相關的命令的使用等知識點。

任務 1: 進程編程

1.1 進程概念

./a.out //沒有運行之前就是靜態程序,運行之后就是一個進程

怎么區分進程?能夠獨立運行的程序,main。

每個進程都有自己唯一的PID號。

命令行可以通過ps命令獲取后臺進程的PID號。

1.?示例:ps -e 查看后臺全部進程

#include

#include

pid_t getpid(void); //獲取進程PID

pid_t getppid(void);

??C語言代碼方式獲取PID

#include

#include

#include

int main(int argc,char **argv)

{

pid_t pid=getpid();

printf("當前進程PID=%d ",pid);

pid=getppid();

printf("PPID=%d \n",pid);

return 0;

}

1.2 進程的信號

kill 命令功能:給程序發送信號。

查看所有支持的信號:kill -l

poYBAGMlPRKAVXZlAAFB5iEr_Vs751.png

kill [-s signal|-p] [--] pid...

kill -l [signal] :查看指定信號的幫助信息

發送信號的方式:

1.?kill <進程PID> //默認發送的進程終止信號,示例: #kill 348374

2.?kill -s <具體信號> <進程的PID> 示例: #kill -s SIGINT 7646

3.?kill -<具體信號> <進程的PID > 示例: # kill -SIGINT 7734

??信號的捕獲

#include

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t han-dler);

參數

int signum :要捕獲的信號

sighandler_t han-dler:函數指針

??信號的捕獲示例

#include

#include

#include

#include

void sighandler(int sig)

{

printf("捕獲的信號值=%d\n",sig);

}

int main(int argc,char **argv)

{

//將指定信號綁定到指定的函數上

signal(SIGINT,sighandler); //2

signal(SIGIO,sighandler); //29

signal(SIGSYS,sighandler); //31

while(1)

{

sleep(5);

}

return 0;

}

Linux系統和windows這些系統屬于非實時系統。

ucos\uclinux系統屬于實時系統

??josb查看后臺運行的程序作業代號。

??fg 1 將后臺作業代號為1的程序切換到前臺運行

??當程序在前臺運行時,按下 ctrl+z 可以將程序放入后臺,并且暫停運行。

??bg 1 將后臺暫停的程序切換為運行狀態

1.3 進程的創建

#include

#include

#include

#include

int main(int argc,char **argv)

{

pid_t pid;

pid=fork(); //創建一個新的進程

if(pid==0) //子進程

{

printf("子進程pid=%d\n",getpid());

}

else if(pid>0) //父進程

{

printf("父進程pid=%d\n",getpid());

}

else //進程創建錯誤

{

printf("進程創建失敗!\n");

}

return 0;

}

fork 函數創建新進程本身屬于一個拷貝的過程。繼承功能!

??進程的退出

#include

#include

#include

#include

#include

void print(void);

int main(int argc,char **argv)

{

print();

printf("main函數執行!");

return 0;

}

void print(void)

{

printf("子函數執行!");

//return; //終止函數,會將緩沖區里的數據輸出

//exit(0); //直接終止進程,會將緩沖區里的數據輸出

_exit(0); //強制終止進程,銷毀緩沖區中的數據

}

??查看僵尸進程:ps -aux

??查看系統的環境變量: env

??修改控制臺終端的環境變量:export PS1='[\u@\h \W \t]\$'

1.4 進程的執行

#include

int system(const char *command); // “ls -l” …..”cd”

接收命令的返回值:

#include

int main(int argc,char **argv)

{

system("pwd >123.txt"); //獲取腳本或者其他程序的返回值

return 0;

}

??可變形參

#include

void func(int data,...);

int main(int argc,char **argv)

{

int data=888;

func(data,123,456,789,100);

return 0;

}

void func(int data,...)

{

int i=0;

int *p=&data;

for(i=0;i<5;i++)

{

printf("%d\n",*p++);

}

}

??執行進程

#include

#include

int main(int argc,char **argv)

{

execl("/bin/ls","ls","-l",NULL);

printf("123\n");

return 0;

}

#include

#include

int main(int argc,char **argv)

{

execlp("ls","ls","-l",NULL); //PATH=xxx:xxx:xxx:

printf("123\n");

return 0;

}

??管道:FIFO--->先入先出

通過命令行: mkfifo命令可以直接創建FIFO文件。

無名管道的FIFO文件不是實體文件,存在內存中的。

文件的方向: 即 fds[0]和讀端相對應, fds[1]和寫端相對應

有名管道的FIFO文件是實體文件,存在硬盤中的。

#include

#include

/*

#include

int pipe(int pipefd[2]);

*/

int main(int argc,char **argv)

{

int pipefd[2];

char buff[100];

pipe(pipefd); //創建一個無名管道 [0]讀 [1]寫


int pid=fork();

if(pid) //父進程

{

while(1)

{

write(pipefd[1],"12345",6);

sleep(1);

}

}

else //子進程

{

while(1)

{

read(pipefd[0],buff,100);

printf("buff=%s\n",buff);

}

}

return 0;

}

1.5 練習

1. 練習無名管道的通信,刪除指定目錄下的指定后綴的文件。

要求:子進程負責遍歷文件,父進程就負責刪除文件。

#include 
#include 
#include 
#include 

/*
無名管道:
fds[0] 表示讀 
fds[1] 表示寫

int dup2(int oldfd, int newfd); //實現文件描述符的重定向
示例: dup2(fds[1],1); //將本程序的標準輸出定義到管道的寫端

標準輸入:0
標準輸出:1
標準錯誤:2
*/
int main(int argc,char **argv)
{
	if(argc!=2)
	{
		printf("參數格式: ./app <傳入一個文件>\n");
		exit(-1); //退出進程
	}
	
	int fds[2]; //定義了管道文件
	pipe(fds);  //創建無名管道文件
	char buff[100];
	char cmd[100];
	int status;
	int pid=fork();
	int len;
	if(pid==0) 	//子進程,遍歷目錄,查找文件
	{
		write(fds[1],argv[1],strlen(argv[1])); //寫入數據
		
		/*
		1. 定義一個二維數組,先將所有目錄遍歷完畢,將得到數據一次性寫過去
		2. 遍歷一個就寫一個。(編寫一個應答機制)
		*/
	}
	else if(pid>0) //父進程,負責刪除文件
	{
		len=read(fds[0],buff,100);
		buff[len]='\0';
		strcpy(cmd,"rm ");
		strcat(cmd,"-rf ");
		strcat(cmd,buff);
		printf("cmd=%s\n",cmd);
		system(cmd); 	//執行最終的操作
		wait(&status); //隨機等待一個子進程退出
	}
	else
	{
		printf("進程創建失敗!\n");
		exit(-1);
	}
	return 0;
}


2. 練習命名管道的通信,刪除指定目錄下的指定后綴的文件。

要求:子進程負責遍歷文件,父進程就負責刪除文件。

dup2(fd_pipe[1],1); //將子進程的標準輸出重定向到管道的寫端

3. (擴展) 通過命名管道實現本地聊天室,一個終端界面表示一個用戶。

注明: 就一個.c程序,運行一個就是一個新的用戶,每個進程之間通過命名管道通信。

(1) 每次運行程序需要輸入用戶名創建用戶名。

(2) 每個新加入一個用戶有歡迎提示,例如: 歡迎xxx加入xxx聊天室。

(3) 可以互相發送內容,發送內容時的格式: <用戶名>: <實際內容>:<發送的時間>

(4) 可以顯示在線人數。

(5) 一個用戶發送內容,所有的用戶都可以顯示出來。

(6) 通過一個文件保存聊天記錄。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11351

    瀏覽量

    210504
  • 編程
    +關注

    關注

    88

    文章

    3640

    瀏覽量

    94031
  • 進程
    +關注

    關注

    0

    文章

    204

    瀏覽量

    14003
收藏 人收藏

    評論

    相關推薦

    RZ T2H PCIe裸機程序開發Linux的配置介紹

    ,還提供2個PCIe Gen3通道等高速外設。本文主要介紹PCIe外設的功能、裸機EP模式的程序開發、以及在Linux,如何編譯網卡的流程。
    的頭像 發表于 12-18 11:14 ?913次閱讀
    RZ T2H PCIe裸機程序<b class='flag-5'>開發</b>和<b class='flag-5'>Linux</b><b class='flag-5'>下</b>的配置介紹

    深入Linux進程管理:提升效率與穩定性的關鍵方法

    目錄 Linux進程管理 8.1 IO負載 8.2 實時進程監控 5.1 作業與會話 5.2 作業分類 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發表于 11-22 11:05 ?371次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理:提升效率與穩定性的關鍵方法

    一文搞懂Linux進程的睡眠和喚醒

    機制 1)信號(Signal): 進程可以通過接受特定信號被喚醒。 2)條件變量(Condition Variable): 多線程編程中用于同步多個線程的工具,可以讓一個線程在某些條件睡眠并等待
    發表于 11-04 15:15

    Linux應用編程的基本概念

    Linux應用編程涉及到在Linux環境開發和運行應用程序的一系列概念。以下是一些涵蓋Linux
    的頭像 發表于 10-24 17:19 ?297次閱讀

    Linux用戶身份與進程權限詳解

    在學習 Linux 系統權限相關的主題時,我們首先關注的基本都是文件的 ugo 權限。ugo 權限信息是文件的屬性,它指明了用戶與文件之間的關系。但是真正操作文件的卻是進程,也就是說用戶所擁有的文件
    的頭像 發表于 10-23 11:41 ?435次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進程</b>權限詳解

    Linux開發怎么學?

    Linux開發怎么學? 學習 Linux 是一個循序漸進、持續不斷的過程。我們可以從以下幾個方面開始 1.了解 Linux 的歷史和發展: 了解
    發表于 10-10 14:34

    嵌入式linux開發的基本步驟有哪些?

    嵌入式Linux開發是一個復雜的過程,涉及到硬件選擇、操作系統移植、驅動開發、應用程序開發等多個方面。以下是嵌入式Linux
    的頭像 發表于 09-02 09:11 ?641次閱讀

    嵌入式linux開發板怎么操作

    嵌入式Linux開發板是一種基于Linux操作系統的嵌入式系統開發平臺。它通常包括一個處理器、內存、存儲器、輸入/輸出接口等硬件組件,以及一個基于L
    的頭像 發表于 09-02 09:09 ?481次閱讀

    嵌入式linux開發板芯片的工作原理

    嵌入式Linux開發板是一種基于Linux操作系統的嵌入式系統開發平臺,它廣泛應用于工業控制、智能家居、智能交通、醫療設備等領域。 嵌入式Linux
    的頭像 發表于 09-02 09:07 ?483次閱讀

    linux開發板與樹莓派的區別

    操作系統的微型計算機,主要用于教育、編程、媒體播放等領域。 硬件配置 Linux開發板:Linux開發板的硬件配置因廠商和型號而異,通常包括
    的頭像 發表于 08-30 15:34 ?1158次閱讀

    linux開發板和單片機開發的區別

    、PIC等,處理能力和內存容量相對較低。 操作系統 Linux開發板通常使用Linux操作系統,具有豐富的軟件資源和開發工具。單片機開發則通
    的頭像 發表于 08-30 15:30 ?1315次閱讀

    Linux 驅動開發與應用開發,你知道多少?

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux驅動開發主要是針對硬件設備進行
    的頭像 發表于 08-30 12:16 ?951次閱讀
    <b class='flag-5'>Linux</b> 驅動<b class='flag-5'>開發</b>與應用<b class='flag-5'>開發</b>,你知道多少?

    深入探討Linux進程調度器

    Linux操作系統作為一個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中一個至關重要的模塊。進程調度器負責決定在任何給定的時刻哪個進程
    的頭像 發表于 08-13 13:36 ?1001次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進程</b>調度器

    linux查詢進程占用的內存方法有哪些?

    linux查詢進程占用的內存方法
    發表于 04-08 06:03

    linux多線程編程實例

    linux線程
    的頭像 發表于 02-15 21:16 ?533次閱讀
    <b class='flag-5'>linux</b>多線程<b class='flag-5'>編程</b>實例
    主站蜘蛛池模板: 亚洲高清视频一区 | 午夜色a大片在线观看免费 午夜色大片在线观看 | 日韩精品一级毛片 | 国产肥女bbwbbw | 亚洲欧美国产高清va在线播放 | 午夜美女视频在线观看高清 | 成人免费视频一区二区三区 | 亚洲精品香蕉婷婷在线观看 | 成人五级毛片免费播放 | 啪啪免费看| 日韩精品你懂的在线播放 | 日本免费网 | 亚洲最大成人在线 | 69精品在线 | 91寡妇天天综合久久影院 | 1314亚洲人成网站在线观看 | 在线看欧美成人中文字幕视频 | 亚洲欧洲无码一区二区三区 | 亚洲天天做夜夜做天天欢人人 | 天堂资源bt | 欧美三级手机在线 | 亚洲久久在线 | 女人张开双腿让男人桶完整 | 国产稀缺精品盗摄盗拍 | 国产亚洲一区二区三区在线 | 俺来色 | 国产精品一区二区三区四区 | 久久国产精品岛国搬运工 | 色视频免费在线观看 | 日本黄色a级 | 午夜影院免费版 | freee性欧美 freesexvideo性2 | 1000rt人体1000欧美 | 中文字幕亚洲一区二区三区 | 操一操干一干 | 国产又爽又黄又粗又大 | 免费视频网站在线看视频 | 97se狠狠狠狠狼亚洲综合网 | 在线观看黄色一级片 | 免费看黄资源大全高清 | 色视频色露露永久免费观看 |