unix环境高级编程-进程控制

前端之家收集整理的这篇文章主要介绍了unix环境高级编程-进程控制前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.进程标识

每个进程都有一个非负整型标识的唯一进程id。进程id可复用。当一个进程终止后,其进程id就成为复用的候选者。查看task_struct结构可以发现,表示进程的结构体中有两个成员pid和tgid,pid是内核自己维护的进程号,因为在Linux中线程是由进程实现的,用户看到的进程号是tgid域,这个是线程组号,和线程组内的领头进程的进程号一致,我们在用户程序中调用getpid()其实返回的是tgid值。


2.系统中的专用进程

  • id为0的进程通常是调度进程(也被称为swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。
  • id为1通常是init进程,在系统自举过程结束时由内核调用。该进程负责在自举内核后启动一个unix系统。init进程绝不会终止,它是一个普通的用户进程,但以

超级用户特权运行。

  • 每个unix系统实现都有它自己的一套提供操作系统服务的内核进程。如有些id为2的进程是page daemon(页守护进程),此进程负责支持虚拟存储器系统的分页操作。


3.查看进程中相关标识符操作

#include <unistd.h>
pid_t getpid(void); 返回值:调用者的进程id,(其实是tgid);
pid_t getppid(void); 返回值:调用者的父进程的id;
uid_t getuid(void); 返回值:调用进程的实际用户id;
uid_t geteuid(void); 返回值:调用进程的有效用户id;
uid_t getgid(void); 返回值:调用进程的实际组id;
uid_t getugid(void); 返回值:调用进程的有效组id;

4.创建进程(重点)

一个现有进程可以调用fork函数创建一个新的进程

#include<unistd.h>

pid_t fork(void); //返回值:子进程返回0,父进程返回子进程id;若出错,则返回-1


Linux3.2.0提供了另一种新进程创建函数-clone:它允许调用者控制哪些部分由父进程和子进程共享。


注意:

子进程是父进程的副本。譬如,子进程获得父进程数据空间、堆和栈的副本父进程和子进程并不共享这些存储空间部分,父进程和子进程共享text area

5.写时复制技术

6.fork与I/O函数之间的交互关系


7.文件共享

  • 父进程的所有打开文件描述符都被复制到子进程中(复制相当于执行了dup函数
  • 父进程和子进程共享一个文件表项
  • 父进程和子进程共享同一个文件偏移量


fork之后处理文件描述符的常用情况:

  1. 父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进程终止后,它曾进行过读、写操作的任一共享描述符的文件偏移量已经更新
  2. 父进程和子进程各自执行不同的程序段。在这种情况下,在fork之后,父进程和子进程各自关闭他们不需要使用的文件描述符(互不干扰)。比如(网络服务器)


父子进程的区别:

1.fork的返回值不同

2.进程id不同,父进程id不同

3.子进程的tms_utime,tms_stime,tms_cutime和tms_ustime的值设置为0

4.子进程不继承父进程设置的文件

5.子进程的未处理闹钟被清除

6.子进程的悬而未决信号集设置为空集

猜你在找的Bash相关文章