1.fork函数函数
做用:建立一个子进程ui
函数原型:pid_t fork();spa
返回值:设计
两个返回值,一个是父进程的返回值,其值为子进程的进程id;一个是子进程的返回值,为0表明建立成功,-1表明建立失败。调试
循环建立n个进程:code
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 int i; 8 pid_t pid; 9 for(i=0;i<5;i++){ 10 pid = fork(); 11 if(pid == -1){ 12 perror("fork error"); 13 exit(1); 14 }else if(pid == 0){ 15 break; 16 } 17 } 18 19 if(i<5){ 20 sleep(i); 21 printf("I'm %d child,pid = %u\n",i+1,getpid()); 22 }else{ 23 sleep(i); 24 printf("I'm parent\n"); 25 } 26 return 0; 27 }
2.一些相关函数blog
pid_t getpid(void);进程
获取当前进程的id内存
pid_t getppid(void);get
获取当前进程的父进程的id
uid_t getuid(void);
获取当前进程实际用户id
uid_t geteuid(void);
获取当前进程有效用户id
例:sudo apt-get install
有效用户为su,而不是当前用户。
gid_t getgid(void);
获取当前进程使用用户组id
gid_t getegid(void);
获取当前进程有效用户组id
3.进程共享
fork以后,父子进程的相同与不一样之处以下:
相同处:全局变量(父子不共享)、.data(数据段)、.text(代码段)、栈、堆、环境变量、用户id、宿主目录、进程工做目录、信号处理方式;
不一样处:进程id、fork返回值、父进程id、进程运行时间、闹钟(定时器)、未决信号集;
当前父子进程之间遵循读时共享写时复制的原则,这样设计,不管子进程执行父进程的逻辑仍是本身的逻辑都能节省内存。
父子进程之间共享:1.文件描述符(打开文件的结构体);2.mmap创建的映射区
4.gdb调试
使用gdb调试的时候,gdb只能跟踪一个进程,能够在fork函数调用以前,经过指令设置gdb跟踪父进程或子进程,默认跟踪父进程。
set follow-fork-mode child 设置跟踪子进程
set follow-fork-mode parent 设置跟踪父进程
注意:在有多个子进程时,能够在相应的子进程处设置(条件)断点。