进程共享
getuid 函数
【获取当前进程实际用户ID】
uid_t getuid(void);
【获取当前进程有效用户ID】
uid_t geteuid(void);
getgid 函数
【获取当前进程使用用户组ID】
gid_t getgid(void);
【获取当前进程有效用户组ID】
gid_t getegid(void);
进程共享
- 父子进程之间在fork后。有哪些相同,哪些不同呢?
【fork之后】
- 同:全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式……
- 异:进程ID、fork返回值、父进程ID、进程运行时间、定时器、未决信号集
- 【问题】似乎,子进程复制了父进程的0-3G用户空间内容,以及父进程的PCB,但pid不同。真的每fork一个子进程都熬将父进程的0-3G地址空间完全拷贝一份,然后再映射到物理内存吗?
【答案】当然不是。父子进程间遵循读时共享(物理空间)写时复制的原则。这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销 - 【练习】编写程序测试,父子进程是否共享全局变量
【代码】
#include <stdio.h>
#include <unistd.h>
int num = 5;
//创建单个子进程
int main()
{
pid_t pid;
pid = fork();
if(pid == 0) //子进程
{
num++;
printf("I'm child, num = %d\n", num);
}
else if(pid > 0)
{
sleep(1);
num += 2;
printf("I'm parent, num = %d\n", num);
}
else
{
return -1;
}
return 0;
}
【运行结果】子进程在5的基础上+1,num = 6; 父进程在5的基础上+2,num = 7; 所以父子进程的数据段是独立的,不共享全局变量
【重点注意】躲避父子进程共享全局变量的知识误区!
【重点】父子进程之间共享:文件描述符(打开文件的结构体);mmap建立的映射区
特别的,fork之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算法