91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux開發(fā)_Linux下進(jìn)程編程

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【摘要】 介紹Linux下進(jìn)程概念、進(jìn)程信號捕獲、進(jìn)程管理相關(guān)的命令的使用等知識點(diǎn)。

任務(wù) 1: 進(jìn)程編程

1.1 進(jìn)程概念

./a.out //沒有運(yùn)行之前就是靜態(tài)程序,運(yùn)行之后就是一個進(jìn)程

怎么區(qū)分進(jìn)程?能夠獨(dú)立運(yùn)行的程序,main。

每個進(jìn)程都有自己唯一的PID號。

命令行可以通過ps命令獲取后臺進(jìn)程的PID號。

1.?示例:ps -e 查看后臺全部進(jìn)程

#include

#include

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

pid_t getppid(void);

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

#include

#include

#include

int main(int argc,char **argv)

{

pid_t pid=getpid();

printf("當(dāng)前進(jìn)程PID=%d ",pid);

pid=getppid();

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

return 0;

}

1.2 進(jìn)程的信號

kill 命令功能:給程序發(fā)送信號。

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

poYBAGMlPRKAVXZlAAFB5iEr_Vs751.png

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

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

發(fā)送信號的方式:

1.?kill <進(jìn)程PID> //默認(rèn)發(fā)送的進(jìn)程終止信號,示例: #kill 348374

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

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

??信號的捕獲

#include

typedef void (*sighandler_t)(int);

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

參數(shù):

int signum :要捕獲的信號

sighandler_t han-dler:函數(shù)指針

??信號的捕獲示例

#include

#include

#include

#include

void sighandler(int sig)

{

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

}

int main(int argc,char **argv)

{

//將指定信號綁定到指定的函數(shù)上

signal(SIGINT,sighandler); //2

signal(SIGIO,sighandler); //29

signal(SIGSYS,sighandler); //31

while(1)

{

sleep(5);

}

return 0;

}

Linux系統(tǒng)和windows這些系統(tǒng)屬于非實(shí)時系統(tǒng)。

ucos\uclinux系統(tǒng)屬于實(shí)時系統(tǒng)

??josb查看后臺運(yùn)行的程序作業(yè)代號。

??fg 1 將后臺作業(yè)代號為1的程序切換到前臺運(yùn)行

??當(dāng)程序在前臺運(yùn)行時,按下 ctrl+z 可以將程序放入后臺,并且暫停運(yùn)行。

??bg 1 將后臺暫停的程序切換為運(yùn)行狀態(tài)

1.3 進(jìn)程的創(chuàng)建

#include

#include

#include

#include

int main(int argc,char **argv)

{

pid_t pid;

pid=fork(); //創(chuàng)建一個新的進(jìn)程

if(pid==0) //子進(jìn)程

{

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

}

else if(pid>0) //父進(jìn)程

{

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

}

else //進(jìn)程創(chuàng)建錯誤

{

printf("進(jìn)程創(chuàng)建失敗!\n");

}

return 0;

}

fork 函數(shù)創(chuàng)建新進(jìn)程本身屬于一個拷貝的過程。繼承功能!

??進(jìn)程的退出

#include

#include

#include

#include

#include

void print(void);

int main(int argc,char **argv)

{

print();

printf("main函數(shù)執(zhí)行!");

return 0;

}

void print(void)

{

printf("子函數(shù)執(zhí)行!");

//return; //終止函數(shù),會將緩沖區(qū)里的數(shù)據(jù)輸出

//exit(0); //直接終止進(jìn)程,會將緩沖區(qū)里的數(shù)據(jù)輸出

_exit(0); //強(qiáng)制終止進(jìn)程,銷毀緩沖區(qū)中的數(shù)據(jù)

}

??查看僵尸進(jìn)程:ps -aux

??查看系統(tǒng)的環(huán)境變量: env

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

1.4 進(jìn)程的執(zhí)行

#include

int system(const char *command); // “l(fā)s -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++);

}

}

??執(zhí)行進(jìn)程

#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命令可以直接創(chuàng)建FIFO文件。

無名管道的FIFO文件不是實(shí)體文件,存在內(nèi)存中的。

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

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

#include

#include

/*

#include

int pipe(int pipefd[2]);

*/

int main(int argc,char **argv)

{

int pipefd[2];

char buff[100];

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


int pid=fork();

if(pid) //父進(jìn)程

{

while(1)

{

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

sleep(1);

}

}

else //子進(jìn)程

{

while(1)

{

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

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

}

}

return 0;

}

1.5 練習(xí)

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

要求:子進(jìn)程負(fù)責(zé)遍歷文件,父進(jìn)程就負(fù)責(zé)刪除文件。

#include 
#include 
#include 
#include 

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

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

標(biāo)準(zhǔn)輸入:0
標(biāo)準(zhǔn)輸出:1
標(biāo)準(zhǔn)錯誤:2
*/
int main(int argc,char **argv)
{
	if(argc!=2)
	{
		printf("參數(shù)格式: ./app <傳入一個文件>\n");
		exit(-1); //退出進(jìn)程
	}
	
	int fds[2]; //定義了管道文件
	pipe(fds);  //創(chuàng)建無名管道文件
	char buff[100];
	char cmd[100];
	int status;
	int pid=fork();
	int len;
	if(pid==0) 	//子進(jìn)程,遍歷目錄,查找文件
	{
		write(fds[1],argv[1],strlen(argv[1])); //寫入數(shù)據(jù)
		
		/*
		1. 定義一個二維數(shù)組,先將所有目錄遍歷完畢,將得到數(shù)據(jù)一次性寫過去
		2. 遍歷一個就寫一個。(編寫一個應(yīng)答機(jī)制)
		*/
	}
	else if(pid>0) //父進(jìn)程,負(fù)責(zé)刪除文件
	{
		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); 	//執(zhí)行最終的操作
		wait(&status); //隨機(jī)等待一個子進(jìn)程退出
	}
	else
	{
		printf("進(jìn)程創(chuàng)建失敗!\n");
		exit(-1);
	}
	return 0;
}


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

要求:子進(jìn)程負(fù)責(zé)遍歷文件,父進(jìn)程就負(fù)責(zé)刪除文件。

dup2(fd_pipe[1],1); //將子進(jìn)程的標(biāo)準(zhǔn)輸出重定向到管道的寫端

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

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

(1) 每次運(yùn)行程序需要輸入用戶名創(chuàng)建用戶名。

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

(3) 可以互相發(fā)送內(nèi)容,發(fā)送內(nèi)容時的格式: <用戶名>: <實(shí)際內(nèi)容>:<發(fā)送的時間>

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

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11755

    瀏覽量

    218995
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97166
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    211

    瀏覽量

    14532
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux進(jìn)程管理不用愁!這6個工具幫你搞定90%場景

    Linux 系統(tǒng)中,進(jìn)程是資源分配的基本單位,無論是服務(wù)器運(yùn)維、程序調(diào)試還是日常使用,掌握進(jìn)程管理工具都是必備技能。今天就帶大家梳理 6 個最常用的進(jìn)程管理工具,從查看
    的頭像 發(fā)表于 02-04 16:23 ?1419次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理不用愁!這6個工具幫你搞定90%場景

    Linux進(jìn)程樹分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化Linux系統(tǒng))

    Linux 系統(tǒng)開發(fā)與運(yùn)維中,理解進(jìn)程的運(yùn)行狀態(tài)和相互關(guān)系是排查問題、優(yōu)化性能的基礎(chǔ)。pstree 作為一款輕量高效的進(jìn)程樹可視化工具,能直觀展示系統(tǒng)中所有
    的頭像 發(fā)表于 02-04 16:21 ?710次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>樹分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化<b class='flag-5'>Linux</b>系統(tǒng))

    Linux 開發(fā)嵌入式必備命令速查表

    管理等環(huán)節(jié)輕松應(yīng)對各種問題。今天,我們整理了一份Linux嵌入式開發(fā)必備命令速查表,讓你一篇文章就能快速查閱。一、文件與目錄管理命令在嵌入式開發(fā)中,你經(jīng)常需要操作
    的頭像 發(fā)表于 01-19 09:06 ?872次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>下</b><b class='flag-5'>開發(fā)</b>嵌入式必備命令速查表

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    Linux系統(tǒng)中,進(jìn)程調(diào)度就像一位精明的“CPU管理員”——它決定著哪個進(jìn)程能優(yōu)先使用CPU,多久切換一次進(jìn)程,如何平衡系統(tǒng)響應(yīng)速度與資源利用率。小到桌面應(yīng)用的流暢點(diǎn)擊,大到服務(wù)器的
    的頭像 發(fā)表于 12-24 07:05 ?4284次閱讀
    深入<b class='flag-5'>Linux</b>內(nèi)核:<b class='flag-5'>進(jìn)程</b>調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    解析Linux進(jìn)程、線程和協(xié)程

    影響其他進(jìn)程進(jìn)程之間是高度隔離的。Linux中,進(jìn)程進(jìn)程標(biāo)識符(PID)唯一標(biāo)識。 進(jìn)程
    發(fā)表于 12-22 11:00

    Linux驅(qū)動開發(fā)的必備知識

    內(nèi)核基礎(chǔ)知識: 1、熟悉 Linux 內(nèi)核的架構(gòu)、模塊系統(tǒng)、進(jìn)程管理、內(nèi)存管理等。 了解內(nèi)核的編譯和加載過程。 2、C編程技能: 精通 C 語言編程,包括指針操作、內(nèi)存管理、結(jié)
    發(fā)表于 12-04 07:58

    【免費(fèi)送書】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)》

    Linux系統(tǒng)的設(shè)備驅(qū)動開發(fā),一直給人門檻較高的印象,主要因內(nèi)核機(jī)制抽象、需深度理解硬件原理、開發(fā)調(diào)試難度大所致。2021年,一本講解驅(qū)動開發(fā)的專著問世即獲市場青睞,暢銷近萬冊——這便
    的頭像 發(fā)表于 11-18 08:06 ?1372次閱讀
    【免費(fèi)送書】成為硬核<b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)</b>者:《<b class='flag-5'>Linux</b> 設(shè)備驅(qū)動<b class='flag-5'>開發(fā)</b>(第 2 版)》

    Linux進(jìn)程間通信(IPC)全解析:從管道到?Socket,一篇講透

    在?Linux?世界里,進(jìn)程并非孤立存在。無論是后臺服務(wù)協(xié)作(如?Web?服務(wù)器與數(shù)據(jù)庫)、命令行工具聯(lián)動(如ps | grep),還是復(fù)雜應(yīng)用的模塊通信,都離不開 進(jìn)程間通信(IPC
    的頭像 發(fā)表于 11-14 21:38 ?1.3w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>間通信(IPC)全解析:從管道到?Socket,一篇講透

    RK3506開發(fā)Linux開發(fā)板極致性價比之選

    RK3506開發(fā)Linux開發(fā)板極致性價比之選瑞芯微RK3506開發(fā)板,3核Cortex-A7@1.5GHz+Cortex-M0,Linux
    的頭像 發(fā)表于 09-11 16:26 ?3439次閱讀
    RK3506<b class='flag-5'>開發(fā)</b>板<b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)</b>板極致性價比之選

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】—— linux 進(jìn)程創(chuàng)建

    Linux進(jìn)程通信方式有這幾種: 1。管道 2。信號量 3。消息隊列 4。共享內(nèi)存 在本帖子中,我會講解fork(),exit()系統(tǒng)調(diào)用的實(shí)踐。通過應(yīng)用編程來實(shí)現(xiàn)系統(tǒng)調(diào)用。 1,進(jìn)程
    發(fā)表于 09-01 20:49

    Linux 應(yīng)用開發(fā)手冊

    T507linux應(yīng)用開發(fā)手冊
    發(fā)表于 08-22 17:01 ?15次下載

    Linux常用命令大全

    Linux常用命令是指在Linux操作系統(tǒng)中廣泛使用的命令工具,這些命令工具可以完成各種不同的任務(wù),如管理文件和目錄、操作進(jìn)程、網(wǎng)絡(luò)通信、軟件安裝等。
    的頭像 發(fā)表于 05-03 18:08 ?1855次閱讀

    Linux系統(tǒng)進(jìn)程管理入門指南

    Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對于系統(tǒng)管理員和開發(fā)者來說非常重要
    的頭像 發(fā)表于 04-22 14:34 ?1126次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進(jìn)程</b>管理入門指南

    LinuxVim編輯器的使用技巧

    【Vim】常用總結(jié)? 簡介? image 什么是vim?? Linux兩大編輯神器之一 vim ? Linux/Unix使用最多的編輯器 ? vi的改進(jìn)版 ? 可能是最難上手的編輯
    的頭像 發(fā)表于 04-01 17:36 ?1406次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>Vim編輯器的使用技巧

    [迅為]Linux開發(fā)小技巧:Remote - SSH插件

    [迅為]Linux開發(fā)小技巧:Remote - SSH插件
    的頭像 發(fā)表于 04-01 15:46 ?1154次閱讀
    [迅為]<b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)</b>小技巧:Remote - SSH插件