【Linux】进程

当当当当~~,你是不是好奇什么是进程呢?这篇文章带你了解了解什么是进程,及其进程相关知识。

1. 什么是进程

  • 从操作系统角度分析,进程是一个运行中程序描述 —— PCB(进程控制块)。

【查看进程】

ps -ef (查看所有进程信息) / aux (信息更详细) 
pid_t getpid(void) //获取调用进程的ID

2. 进程的状态

  • 运行、就绪、阻塞;
  • linux下的状态有:运行状态R / 可中断休眠状态S / 不可中断休眠状态D / 停止状态T / 死亡状态X / 追踪状态t / 僵尸状态Z。

【什么是僵尸进程】

  • 僵尸状态:进程已经退出,但是资源没有完全释放;
  • 僵尸进程:处于僵尸状态的进程;
  • 僵尸进程的产生:子进程先于父进程退出,为了保存退出的原因,资源并没有完全被释放。父进程没有关注子进程退出状态,则子进程成为僵尸进程。

3. 进程创建

pid_t fork(void) -> 通过复制父进程,创建子进程

返回值:
    -1:创建子进程失败
    =0:对于子进程,返回值时0
    >0:对于父进程,返回值是子进程的pid
pid_t pid = fork(); //创建一个子进程
if (pid < 0)
{
	perror("fork error"); //出错
	return -1;
}
else if (pid == 0)//子进程
{ 
	sleep(3);
	exit(0); //僵尸进程->子进程先于父进程退出
}

4. 进程终止

  • 进程的终止场景:异常退出;正常退出,结果符合预期;正常退出,结果不预期。
//获取一个系统调用的错误信息
void perror(char *msg)  
char *strerror(int errno)

【如何终止一个进程】

  1. 在main函数中return;
  2. 在任意地方调用exit(int statu)接口----库函数接口----退出前都会刷新缓冲区;
  3. 在任意地方调用_exit(int statu)接口----系统调用接口----退出时会直接释放所有资源。
int main()
{
	printf("今天有些小糟糕!");
	sleep(3);
	_exit(0); //_exit:直接退出,释放所有资源
	exit(0);  //exit:退出刷新缓冲区
	return 0; // return:退出进程时,刷新缓冲区,把缓冲区文件写到文件中
}

5. 进程等待

int wait(int *statu); --阻塞接口--等待任意一个子进程退出,若没有子进程退出,则一直等待子进程的返回值会放到传入的参数statu中。
int main()
{
	pid_t pid = fork(); //创建一个子进程
	if (pid < 0)
	{
		perror("fork error"); 
		return -1;
	}
	else if (pid == 0)
	{ 
		sleep(3);
		exit(0); //僵尸进程
	}
	
	wait(NULL);
	
	while(1)//死循环
	{ 
 		printf("------\n");
		sleep(1);
	}
	return 0;
}
pid_t waitpid(pid_t pid, int *status, int options);

1. 可以的等待指定pid的子进程退出;
2. status:返回值;
3. options 若被指定为 WNOHANG ,则将waitpid设置为非阻塞;
4. pid:-1:表示等待任意一个子进程;
        >0:表示等待指定pid的子进程;
5.返回值:
        >0:返回的是退出子进程的pid;
        =0:没有子进程退出;
        <0:等待错误;

6. 进程替换

  • 替换一个进程正在运行的程序。
exec函数族:

l:
int execl(const char *path, const char *arg, ...); //path:一个可执行程序文件的路径名; *arg, ...:运行参数
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);

v:
int execv(const char *path, char *argv[]);
int execvp(const char *file, char *argv[]);
int execve(const char *file, char *argv[], char *const envp[]);
execl("/bin/ls", "ls", "-l", "-a", NULL);//“ls”运行参数

【附录】

【注意】以上呐,简单对进程进行梳理,若有不足之处,请指出。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值