进程是Linux
程序设计中最重要的部分,它是一个正在执行的程序的映象。每个进程都包括程序代码和数据,其中数据包括程序变量数据、外部数据和程序堆栈等。
进程的创建
函数原型
#include <unistd.h>
pid_t fork(void);
如果调用成功,内核会新建一个新的进程,新产生的进程叫子进程,它是调用fork
进程(称为父进程)的副本。它们俩拥有相同的变量及值,不过这些变量占用不同的地址空间。返回值是pid_t
类型,是进程的唯一标识符,可以用来区别父子进程。在父进程中pid
是一个非0的正整数,在子进程中pid
的值为0。因此可以据此来给父子进程分配不同的工作。
进程的执行
函数原型
#include <unistd.h>
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[]);
exec
系列函数调用用于新程序的运行。如果调用成功,父进程将被覆盖,然后从新程序的入口开始执行,这就产生了一个新进程,只不过这个进程的标识符pid
是和父进程是一样的。上述函数声明中,参数path
和file
的区别是:前者指向程序所在的路径名,后者指向的是一个简单的文件名。
进程的终止
函数原型
#include <unistd.h>
void _exit(int status);
参数status
为进程的退出状态,返回值通常用于指出进程所完成任务的成败,0表示成功,否则出错。exit()
除了实现进程的终止以外,还会关闭所有已经打开的文件及做一些系统清理的工作。
另外,函数void _exit(int status)
也实现exit()
一样的功能,在unistd.h
中声明,只是它不做系统清除的工作。