进程控制

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 设置跟踪父进程

  注意:在有多个子进程时,能够在相应的子进程处设置(条件)断点。

相关文章
相关标签/搜索