目录
进程
获取进程id
#include <unistd.h>
pid_t getpid(void); //获取当前进程id
pid_t getppid(void); //获取父进程id
返回值: 成功返回当前/父进程id。
/proc/PID 获取与进程相关的信息
cat /proc/1/status #获取init进程状态信息
uname() 获取主机系统的标识信息
#include <sys/utsname.h>
int uname(struct ustname* utsbuf);
//utsname数据结构
struct utsname {
char sysname[_UTSNAME_LENGTH];
char nodename[_UTSNAME_LENGTH];
char release[_UTSNAME_LENGTH];
char version[_UTSNAME_LENGTH];
char machine[_UTSNAME_LENGTH];
#ifdef _GUN_SOURCE
char domainname[_UTSNAME_LENGTH];
#endif
}
返回值: 成功返回0,失败返回-1。
fork() 创建子进程
#include <unistd.h>
pid_t fork(void);
返回值: 如果返回值大于0,表示进入父进程;如果返回值等于0,表示进入子进程中,如果返回值等于-1,表示创建失败。
wait() 阻塞等待子进程结束
#include <sys/wait.h>
pid_t wait(int* stauts);
pid_t waitpid(pid_t pid,int* status, int options);
int waitid(idtype_t idtype,id_t id,siginfo_t* infop,int options);
status: 返回进程的终止状态。
pid: 意义如下:
pid > 0 | 表示等待进程ID为pid的子进程 |
---|---|
pid = 0 | 表示等待与父进程同意个进程组的所有子进程 |
pid < -1 | 表示等待进程组标识与pid绝对值相等的所有子进程 |
pid = -1 | 表示等待任意子进程 |
options: 取值如下:
WUNTRACED | 除了返回终止进程的信息外,还返回因信号而停止的子进程信息 |
---|---|
WCONTINUED | 返回那些因收到SIGCONT信号而恢复执行的已停止子进程的状态信息 |
WNOHANG | 如果参数pid所指定的子进程并未 发生状态改变,则立即返回0.如果并无与pid匹配的子进程,则报错,错误号置为ECHILD。 |
返回值: 成功返回终止进程的id,失败返回-1。
守护进程、孤儿进程和僵尸进程
守护进程:就是服务,独立于终端以外,关闭终端之后,该进程任然存在。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。