嵌入式Linux进程1

1.进程的概念

  • 概念
    程序是指编译过的可执行的二进制代码,再大点可以叫应用。进程是指正在运行的程序,一个程序可以有多个进程,一个进程中可以有多个线程。
    输入命令 top可以看到pid一直在刷新
    在这里插入图片描述

2,进程ID

  • 概念
    每一个进程都有一个唯一的标识符,进程 ID 简称 pid。
    进程的 ID 在一个固定的时刻是唯一的,需要注意的是,假如你在 s 秒的时候有一个进程 ID
    是 1000,在另外一个时刻 s+n,另一个进程 ID 也有可能是 1000。
    另外内核运行的第一个进程是 1,也就是内核的 init 程序,这个是唯一的。
    进程 id 一般默认的最大值为 32768,不过也是可以修改的,当然一般情况下不需要这么做。
    如果当前进程是 1000,那么下一个分配的进程就是 1001,它是严格线性分配的。直到 pid 到
    了最大值,才重新分配已经用过的进程 ID,当然这些进程都是已经死亡的进程。
    除了 init 进程,其它进程都是由其它进程创立的。创立新进程的进程叫父进程,新进程叫
    子进程。

  • 函数

    pid_t getpid(void);
    参数:无。
    返回值:成功返回进程号。
    
    pid_t getppid(void);
    参数:无。
    返回值:成功返回父进程。
    
  • 实验例程

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    void main()
    {
    	pid_t idp,id;
    	
    	idp = getppid();
    	printf("ppid = %d\n",idp);
    	
    	id = getpid();
    	printf("pid = %d\n",id);
    }
    
  • 在ubuntu下编译,加载到开发板运行
    可以看到当前进程号和父进程号

  • 进程有两个命令,ps和kill分别是查看和终止进程

3.exex函数族 - 执行新程序

  • 介绍
    在 linux 中,exec 函数族是把程序直接载入内存,而不是在一个程序中运行多个进程。exec 函数族调用成功之后,会在内存中执行一个新的程序。在 linux 中要运行多任务需要使用 exec 函数族和 fork 进程。
  • 有六个exec函数
    在这里插入图片描述
    首先函数族都是以 exec+xx 的方式命名的。
    “l”和“v”表示参数是以列表还是以数组的方式提供的。
    “p”表示这个函数的第一个参数是*path,就是以绝对路径来提供程序的路径,也可以以
    当前目录作为目标。
    “e”表示为程序提供新的环境变量。
  • 例程
    execl.c
#include<stdio.h> 
#include<string.h>
#include<stdlib.h>
#include <unistd.h>

//exec函数族
int main(void)
{
	if(execl("/mnt/udisk/helloexec","helloexec","execl",NULL) == -1){
		perror("execl error");
		exit(1);
	}
	//程序已经跳转走,如果正常execl不反回错误,下面的代码不会执行!
	printf("execl error!\n");
	return 0;
}

helloexex.c

#include <stdio.h>

int main(int arc,char *argv[])
{
	printf("Hello %s!\n",argv[1]);
}
  • 在ubuntu下编译,加载到开发板运行
    在这里插入图片描述

4.fork 创建新进程

  • 在 linux 中可以使用 fork 创建和当前进程一样的进程,新的进程叫子进程,原来的进程叫
    父进程。
  • pid_t fork(void);
    参数:无
    返回值:执行成功,子进程 pid 返回给父进程,0 返回给子进程;出现错误-1,返回给父
    进程。
  • 例程
#include <stdio.h>
#include <unistd.h>

main()
{
	pid_t pid;
	int i=100;
	
	pid = fork();
	//调用出错
	if(pid == -1){
		printf("fork failed\n");
		return 1;
	}
	//返回给父进程子进程号,返回值大于0
	else if(pid){
		i++;
		printf("\nThe father i = %d\n",i);
		printf("The father return value is %d\n",pid);
		printf("The father pid is %d\n",getpid());
		printf("The father ppid is %d\n",getppid());
		while(1);
	}
	//返回子进程0,返回值等于0返回给子进程
	else{
		i++;
		printf("\nThe child i = %d\n",i);
		printf("The child return value is %d\n",pid);
		printf("The child pid is %d\n",getpid());
		printf("The child ppid is %d\n",getppid());
		while(1);
	}
	return 0;
}

5.进程终止 exit

  • 在 main 函数的结尾会使用 return 或者exit 结束程序。当使用 exit 的时候,就是使用的进程终止函数 exit。
  • void exit(int status)
    参数:返回给父进程的参数。
    返回值:无
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIOT技术栈

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值