进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
进程IP
每一个进程都有一个唯一的标识符,进程ID 简称pid,PID虽然是唯一的,但是其可以重用;当一个进程终止后,其它进程就可以使用它的pid了,内核运行的第一个进程是1,pid为1的进程称为init进程,它是一个普通的用户进程,但是以超级用户特权运行;pid为2的进程是页守护进程,负责支持虚拟存储系统的分页操作
进程id一般默认最大值为32768,不过也是可以修改的,一般不需修改;如果当前进程是1000,那么下一个分配的进程是1001,它是严格线性分配的,直到pid到了最大值,才重新分配已经用过的进程id,当然这些进程都是已经死亡的进程
除了init进程,其它进程都是由其它进程创建的,创建新进程的过程叫父进程,新进程叫子进程
获取进程函数
获得父进程和子进程的函数分别是getpid和getppid,可以man查看其用法
exec函数族
在Linux中,exec函数族是把程序直接载入内存,而不是在一个程序中运行多个进程;exec函数调用成功后,会在内存里执行一个新的程序,在Linux中要运行多任务需要使用exec函数族和fork进程
madmanazo@ubuntu:~$ man 3 exec
SYNOPSIS
#include
extern char **environ;
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, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
fork创建新进程
在linux中可以使用fork创建和当前进程一样的进程,新的进程叫子进程,原来的进程叫父进程
NAME
fork - create a child process
SYNOPSIS
#include
pid_t fork(void);
DESCRIPTION
fork() creates a new process by duplicating the calling process. The
new process, referred to as the child, is an exact duplicate of the
calling process, referred to as the parent, except for the following
points:
* The child has its own unique process ID, and this PID does not match
the ID of any existing process group (setpgid(2)).
* The child's parent process ID is the same as the parent's process
ID.
* The child does not inherit its parent's memory locks (mlock(2),
mlockall(2)).
* Process resource utilizations (getrusage(2)) and CPU time counters
(times(2)) are reset to zero in the child.
* The child's set of pending signals is initially empty (sigpend‐
ing(2)).
* The child does not inherit semaphore adjustments from its parent
(semop(2)).
* The child does not inherit record locks from its parent (fcntl(2)).
* The child does not inherit timers from its parent (setitimer(2),
alarm(2), timer_create(2)).
* The child does not inherit outstanding asynchronous I/O operations
from its parent (aio_read(3), aio_write(3)), nor does it inherit any
asynchronous I/O contexts from its parent (see io_setup(2)).
- 系统函数fork调用成功,会创建一个新的进程
- 子进程的pid和父进程不一样,是新分配的
- 子进程的ppid会设置为父进程的pid,也就是说子进程和父进程各自的父进程不一样
- 子进程中的资源统计信息会清零
- 挂起的信号会被清除,也不会被继承
- 所有文件锁也不会被子进程继承
- fork函数执行一次返回两个值:执行失败返回-1表示没有创建新的进程,最初的进程仍然在运行;执行成功会在子进程中返回0,在父进程中返回子进程的PID;这是因为父进程可能存在很多子进程,必须通过这个返回的子进程ID来跟踪子进程,而子进程只有一个父进程,它的ID可以通过getppid获得。fork()执行失败的唯一情况是内存不够或者id号用尽
进程终止exit
在main函数的结尾会使用return或者exit 结束程序。当使用exit 的时候,就是使用的进程终止函数exit