linux进程控制函数--fork,exec,exit,wait,sleep

1.fork

在linux系统中,用户创建进程的唯一方法就是使用系统调用fork,大概要进行下面的操作。

<1>.分配表项,一个用户的进程项是有限的;

<2>.创建子进程的进程标识号;

<3>.复制父进程中的项目给子进程;

<4>.与父进程相连的文件表和索引值加1,与子进程相连;

<5>.内核为子进程创建用户级上下文;

<6>.生成进程的动态部分。

#include <sys/types.h>

#include <unistd.h>

pid_t fork(void);

return:调用成功,对父进程返回子进程的PID,对子进程返回-1;调用失败,返回-1至父进程。

fork函数最重要的就是返回值,非常特殊,返回两个值,分别给父进程和子进程,在fork创建进程时起到至关重要的地方。


2.exec

这个函数最大的作用在于可以取代调用进程的内容,也是linux可以执行新程序的关键。当fork完后调用exec便会进行新进程的进行,这也是为何fork复制出来的子进程执行之后与父进程不一样的根本原因所在。这里还有个“copy-on-write”的技术,提高进程的效率的。

exec系统调用,是一个函数族。

#include<unistd.h>

int execl(const char *path,const char *arg);

int execlp(const char *file,const char *arg);

int execle(const char *path,const char *arg,char *const envp[]);

int execv(const char *path,const char *argv[]);

int execvp(const char *file,const char *argv[]);

int execve(const char *path,const char *argv[],char *const envp[]); //真正意义上的调用函数

除了execlp,execvp之外,其他四个函数必须是一个完整的path

envp存放的是环境变量,何为环境变量?简单来说,就是一组用来确定应用程序在系统中一些细节的值,一般以“XXX=xxx”形式存在。还有一点要注意的是凡是数组都是以NULL结尾。


3.exit

简单一点说,exit函数就是进程结束函数,就是一个进程结束的标识。

这里还要提到一个_exit函数,主要区别在于在linux中的库函数原型不一样,exit()定义在stdlib.h中,_exit定义在unistd.h中。

这里用一句话说明区别,它们都是写入内存,但_exit只有在满足特点条件下才能写入文件,如何要保存数据的完整性,一般使用exit函数。


4.wait

总结了wait的5个知识点:

<1>.僵尸进程:在一个进程调用了exit之后,该进程并非马上消失还留下一些参与的信息

<2>.用wait结束僵尸进程.

 #include <sys/types.h>

#include <sys/wait.h>

pid_t wait (int *stutas)

原理:进程一旦调用了wait,就立即阻塞自己,当分析到当前进程的子进程已经exit,便会收集这个子进程的信息,然后彻底销毁,如果没有找到这样的子进程,就会一直阻塞在这里,直到有一个出现。

<3>.参数status

在wait中,这是一个指向一个整型数据的指针,用来存放子进程退出时的状态,后来又定义了一个WIFEXITED(status)的宏来完成这项工作,这里的status就是一个指针指向的整数。

<4>进程同步。wait可以解决进程的同步问题,通过wait(&status)语句在父进程中等待子进程的返回值。



通过time可以看到父子进程的执行状态,在sleep的5秒中内,此时父进程一直等待子进程的返回值。

<5>waitpid函数。其实,wait是waitpid的包装后的形式。waitpid有三个参数(pid,*status,options)

pid>0,只等待PID=pid的子进程;=0,等待同一进程组中的任何子进程;=-1,等待任何子进程退出,此时=wait;<-1,等待指定进程组中的任何子进程

options:WNOHANG|WUNTRACED,也可设为0,此时=wait。

返回值:1.正常返回子进程的PID;2.若设置了WNOHANG,可能返回0;3.error,返回-1。


5.sleep

就是挂起进程指定的秒数,时间到了返回0。


当然除了这些进程的基本操作以外,还有一些特殊操作。比如,setuid和setgid,setpgrp和setpgid设置进程组ID,chdir修改指定的目录,chroot修改根目录,nice修改权限等等。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值