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

    文章

    10990

    浏览量

    206733
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92388
  • 进程
    +关注

    关注

    0

    文章

    193

    浏览量

    13876
收藏 人收藏

    评论

    相关推荐

    linux查询进程占用的内存方法有哪些?

    linux查询进程占用的内存方法
    发表于 04-08 06:03

    fpga开发板与linux开发板区别

    (Field-Programmable Gate Array)是一种可编程逻辑器件,它可以通过编程改变硬件逻辑电路的功能和结构。FPGA采用了可编程的门极,可以根据需要重新配置内部电路,从而实现不同的功能和逻辑关系。而
    的头像 发表于 02-01 17:09 574次阅读

    linux查看weblogic进程

    Linux操作系统中,WebLogic是一种常用的Java应用服务器,用于部署和管理企业级Java应用程序。为了确保WebLogic服务器正常运行,有时我们需要查看WebLogic进程以了解其状态
    的头像 发表于 12-05 16:07 729次阅读

    linux命令和shell编程有什么联系

    的命令,并提供了许多功能和特性,如变量、控制结构、函数等,这些功能和特性使得Shell编程成为可能。 其次,Linux命令是Shell编程的重要组成部分。通过使用Linux命令,用户可
    的头像 发表于 11-08 10:53 411次阅读

    LinuxC语言编程入门教程

    u3000本文是Linux C 语言编程入门教程。主要介绍了Linux 的发展与特点、C语言的基础知识、Linux 程序设计基础知识及其下
    发表于 09-22 06:56

    浅谈Linux网络编程中的多进程和多线程

    Linux网络编程中,我们应该见过很多网络框架或者server,有多进程的处理方式,也有多线程处理方式,孰好孰坏并没有可比性,首先选择多进程还是多线程我们需要考虑业务场景,其次结合当
    发表于 08-08 16:56 404次阅读
    浅谈<b class='flag-5'>Linux</b>网络<b class='flag-5'>编程</b>中的多<b class='flag-5'>进程</b>和多线程

    怎么才算熟悉linuxLinux系统开发有何难点

    对于有一定 Linux 开发基础希望进阶学习 Linux 系统编程开发人员来说,其难点在于,Linux
    发表于 07-28 11:45 420次阅读

    Linux下查询进程占用的内存方法总结

    今天浩道跟大家一篇关于运维牛人如何在Linux下挖出吃内存的进程,可以说是相当干的一个运维技能了,一起看看吧!
    发表于 07-27 10:51 9205次阅读
    <b class='flag-5'>Linux</b>下查询<b class='flag-5'>进程</b>占用的内存方法总结

    Linux C语言的编程规范

    Linux有独特的编程风格,在内核源代码目录Documentation/CodingStyle,详细描述代码风格。
    发表于 07-21 14:48 216次阅读

    Linux多线程编程基础知识解析

    线程是轻量级的进程(`LWP: Light Weight Process`),在`Linux`环境下线程的本质仍是`进程`,进程是资源分配的`最小单位`,线程是操作系统调度执行的`最小
    发表于 07-14 16:41 475次阅读
    <b class='flag-5'>Linux</b>多线程<b class='flag-5'>编程</b>基础知识解析

    Linux 系统编程的难点是什么

    对于有一定 Linux 开发基础希望进阶学习 Linux 系统编程开发人员来说,其难点在于,Linux
    发表于 06-28 12:54 395次阅读

    Linux进程的睡眠和唤醒

    Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。一旦一个运行中的
    发表于 06-07 12:26 279次阅读

    深度剖析Linux进程控制(下)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程
    的头像 发表于 05-12 10:49 320次阅读
    深度剖析<b class='flag-5'>Linux</b>中<b class='flag-5'>进程</b>控制(下)

    深度剖析Linux进程控制(上)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程
    的头像 发表于 05-12 10:49 328次阅读
    深度剖析<b class='flag-5'>Linux</b>中<b class='flag-5'>进程</b>控制(上)

    Linux内核进程管理与调度:策略优化与实践分析

    今天给大家上点硬货,关于Linux进程管理和调度是学习和理解Linux的必学知识。为协调多个进程 "同时" 运行,现代操作系统通常使用进程
    发表于 05-08 09:42 595次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>进程</b>管理与调度:策略优化与实践分析