一、相关函数
1、创建子进程
pid_t fork(void);
返回值:
成功:
对于父进程来说返回子进程ID
对于子进程来说返回值为0
失败:
如果为-1表示创建失败
2、获取当前进程ID
pid_t getpid(void);
返回值:当前进程ID
3、获取当前进程的父进程ID
pid_t getppid(void);
返回值:当前进程的父进程ID
4、获取当前进程实际用户ID
uid_t getuid(void);
返回值:当前进程实际用户ID
5、获取当前进程使用用户组ID
gid_t getgid(void);
返回值:当前进程使用用户组ID
二、测试源码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int counter = 100;
int main(int argc, const char* argv[])
{
pid_t pid;
int i=0;
for(i=0; i<3; i++)
{
pid = fork();
if(pid == 0)
{
break;
}
}
// 父进程
if(i == 3)
{
counter += 100;
printf("parent process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter);
// sleep(1);
}
// 子进程
else if(i == 0)
{
// 1th
counter += 200;
printf("child process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter);
}
else if(i == 1)
{
// 2th
counter += 300;
printf("child process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter);
}
else if(i == 2)
{
// 3th
counter += 400;
printf("child process, pid = %d, ppid = %d, %d\n", getpid(), getppid(), counter);
}
return 0;
}
三、测试结果
四、源码分析
1、一共创建了3个子进程,使用循环创建,将fork出来的子进程使用break给禁止掉,这样子进程就不会创建新的进程,只是使用父进程创建新的进程。
2、当i=3时,是当前的进程。
3、可以验证,每一个子进程有其独立的内存空间。
4、由于没有回收子进程,每个子进程的父进程变成了孤儿进程,被init进程领养,pid=1。