相同之处:1.全局变量(不能共享,各自有各自的代码段数据,它们是独立的),2. .data(不会共享,各自有各自的值),3. .text(代码段),4.栈,5.堆,6.环境变量,7.用户id,8.宿主目录(由用户决定(home)),9.进程工作目录,10.信号处理方式……
不同之处: 1.进程id, 2.fork返回值:父进程返回值>0,子进程返回值=0 3.各自的父进程id, 6.进程运行时间(父进程从起始位置开始计算,子进程从fork后开始计算) 7.闹钟(定时器,它跟着进程走,每个进程的都不一样) 8.未决信号集
父子进程间遵循:读时共享,写时复制原则
父子共享进程:1.文件描述符fp(打开文件的结构体),2.mmap建立的映射区(进程间通信详解)
创建一个子进程 #include<sys/types.h> #include<unistd.h> pid_t fork(void); 成功:在父进程中返回子进程的PID,失败返回-1 获取进程ID #include<sys/types.h> #include<unistd.h> pid_t getpid(void); 获取当前进程id pid_t getppid(void); 获取当前父进程id #include<sys/types.h> #include<unistd.h> uid_t getuid(void); 返回实际用户id uid_t geteuid(void); 返回有效用户id #include<sys/types.h> #include<unistd.h> uid_t getgid(void); 返回实际用户组id uid_t getegid(void); 返回有效用户组id 创建一个子进程并阻塞父进程 #include<sys/types.h> #include<unistd.h> pid_t vfork(void); 成功:在父进程中返回子进程的PID,在子进程中返回0, 失败返回-1 vfork不会将父进程中的数据空间复制到子进程中 子进程与父进程共享数据空间,父进程等待子进程先执行 创建一个子进程,代码如下: #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<stdlib.h> #include<string.h> int main() { char str[] = "从此开始!!!"; pid_t pid = fork(); if(pid == -1) { perror("fork error:"); exit(1); } else if(pid == 0) { strcmp(str,"child"); printf("I am child,my pid is:%d\n,father pid is:%d,str = %s\n",getpid(),getppid(),str); } else { strcmp(str,"father"); printf("I am father,my pid is:%d\n,father pid is:%d,str = %s\n",getpid(),getppid(),str); sleep(1); } printf("str = %s\n",str); return 0; }