进程标识符
- 头文件
#include <unistd.h>
- 进程标识符
pid_t getpid(void); /* 返回值:调用进程的进程 ID / pid_t getppid(void); / 返回值:调用进程的父进程 ID / uid_t getuid(void); / 返回值:调用进程的实际用户 ID / uid_t geteuid(void); / 返回值:调用进程的有效用户 ID / gid_t getgid(void); / 返回值:调用进程的实际组 ID / gid_t getegid(void); / 返回值:调用进程的有效组 ID */
## **fork** 函数
一个现有进程可以调用 `fork` 函数创建一个新进程。
```c
#include <unistd.h>
pid_t fork(void);
/* 返回值:子进程中返回 0,父进程中返回子进程 ID,出错返回 -1 */
示例代码:
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid;
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) { /* child */
child();
} else { /* parent */
parent();
}
return 0;
}
使 fork
失败的两个主要原因是:系统中已经有太多的进程(通常意味着某个方面出了问题),或者该实际用户 ID 的进程总数超过了系统限制。其中 CHILD_MAX 规定了每个实际用户 ID 在任一时刻可具有最大的进程数。
获取 CHILD_MAX
-
头文件
#include <unistd.h>
-
运行时限制可以通过调用下面三个函数中的一个而取得。
long sysconf(int name); long pathconf(const char *path, int name); long fpathconf(int fd, int name);
-
具体的 name 参数根据系统不同而不同,在 ubuntu 14.04 里面的 <bits/confname.h> 记录这三个函数所用到的参数名。其中
pathconf
和fpathconf
以 _PC_* 开头,sysconf
以 _SC_* 开头。long child_max = sysconf(_SC_CHILD_MAX);