UNIX环境编程_进程控制

进程标识:

  • 每个进程都有一个非负整型表示的唯一进程ID,而进程ID是可以复用的,Unix系统通过延迟复用算法,使得赋予新建进程的进程ID不同于最近终止进程所使用的进程ID。
  • 进程ID = 0 :swapper(交换进程);
  • 进程ID = 1 :init(系统中孤儿进程的父进程)
  • 进程ID = 2 :page daemon(页守护进程,支持虚拟存储器的系统的分页操作);

相关函数

函数get*

1、getpid: 返回调用进程的进程ID;
2、getppid:返回调用进程的父进程ID;
3、getuid: 返回调用进程的实际用户ID;
4、geteuid:返回调用进程的有效用户ID;
5、getgid: 返回调用进程的实际组ID;
6、getegid:返回调用进程的有效组ID。

»»»

函数fork

fork:返回:父进程:pid_t(fork的子进程的进程ID);子进程:0
  • 子进程和父进程执行fork调用之后的指令。子进程是父进程的副本,例如子进程获取父进程的时间空间、堆、栈的副本,但并不共享这些存储空间,父进程与子进程共享部分正文段。
  • vforkfork的升级版,父进程调用vfork产生子进程后,子进程在调用exec前共享父进程的地址空间,而调用exec后运行新的程序,从此往后并不引用父进程地址空间;vfork保证子进程的运行,在子进程调用exec或者exit后父进程再继续调度运行;
  • 除打开文件外,子进程继承父进程的内容:uid; euid; gid; egid; pgid; 附属组ID; SessionID; 控制终端; 当前工作目录; 根目录; 环境; 存储映像; 资源限制等。
  • 子进程与父进程的不同内容:fork返回值;进程ID;子进程不继承父进程的_文件锁_
  • 文件共享:父进程与子进程具有相同的文件描述符(类似于dup复制一个文件描述符),即子进程共享父进程的文件偏移量,当父进程等待子进程后,将更新与父进程共享的该文件的偏移量;并且子进程终止后,父进程将追加在子进程写入的内容之后。
  • fork主要失败原因:a、系统中已经有较多的进程;b、该实际用户ID所拥有的进程总数超过了系统限制;
  • fork的主要用途:a、父进程与子进程各自同时执行不同代码段,常见于网络服务进程(父进程等待请求,请求到达后父进程fork子进程,子进程处理请求);b、子进程执行另一个程序,父进程fork后,子进程立刻调用exec
    »»»

函数exit

进程的终止方式

1、正常终止方式

  • main函数调用return语句 == 调用exit
  • 调用exit函数,包括调用各种终止处理程序、关闭所有标准I/O流,但并不处理多进程(父、子进程)、作业控制、文件描述符等;
  • 调用_exit或者_Exit函数,提供一种无需调用终止处理程序或信号处理程序而终止进程的方法,属于一种系统调用;
  • 进程最后一个线程在其启动例程中执行return语句,并且线程的返回值不作为线程的返回值,进程通常以终止状态0返回;
  • 进程最后一个线程执行pthread_exit函数,进程返回0。

2、异常终止方式

  • 调用abort
  • 接收到某些信号(如存储单元引用越界、分母为零等)
  • 最后一个线程对取消请求作出响应。

»»»

函数waitwaitpid

1、wait:int *statloc(存放进程终止状态的整型指针);
2、waitpid:int *statloc, pid_t pid(进程id), int options(选项,可让调用者阻塞或不阻塞);
  • 调用wait后父进程的状态:a、若子进程正在运行,则阻塞;b、若子进程已经终止,正等待父进程获取其终止状态,则立即取得它的终止状态并返回;c、若无子进程,则立即出错返回。
  • 调用wait不能等待指定的子进程,而waitpid提供了pid参数可以实现这一功能;
  • pid == -1:等待任意子进程;
  • pid > 0:等待进程ID与pid相等的子进程;
  • pid == 0:等待组ID等于调用进程组ID的任一子进程;
  • pid < -1:等待组ID等于pid绝对值的任一子进程;

»»»

函数system

system:const char *char cmdstring(命令行String)
  • system相当于forkexecwaitpid的总和
  • 在设置用户ID位的程序中不能执行system函数,这是一个安全漏洞,因为在system内部执行exec时会将原进程的有效用户ID保持下来。

你可能感兴趣的:(学习笔记,操作系统)