进程原语
1.fork
#include<unistd.h> pid_t fork(void);
fork
子进程复制父进程,子进程和父进程的PID是不一样的,在克隆pcb时,pid没有复制,fork还有底层的函数,如creat(),clone(),retrun 返回。子进程执行的第一条语句是return。
#include<stdio.h> #include<unistd.h> #include<stdlib.h> int main(void) { pid_t pid; int n=10; //调用一次返回两次,在父进程返回子进程的PID,在子进程返回0; pid=fork();//父和子都存在了 if(pid>0) { /*in parent*/ while(1){ printf("I am parent\n",n++); printf("my pid="%d\n",getpid()); printf("my parent pid="%d\n",getppid()); sleep(1); } } else if(pid==0) { /*in child*/ while(1) { printf("I am ch\n",n++); printf("my pid="%d\n",getpid()); printf("my parent pid="%d\n",getppid()); sleep(1); } } else { perror("fork"); exit();//创建进程失败 } return 0; } //读时共享,写时复制,只读时通过虚拟地址映射到同一物理地址,只有进行写操作时才拷贝一份物理地址,这样不会造成物理地址的浪费。
进程相关函数:
#include<sys/types.h> #include<unistd.h> pid_t getpid(void);//返回调用进程的PID pid_t getppid(void);//返回调用进程的PID uid_t getuid(void);//返回实际用户ID uid_t geteuid(void);//返回有效用户ID gid_t getgid(void);//返回实际用户组ID gid_t getegid(void);//返回有效用户ID
sudo chmod 04755 文件名
如passwd命令,可用ls -l 查看其权限位,其在执行时候,临时身份变为了root。
vfork
- 用于fork后马上调用exec函数
- 父子进程,共用同一地址空间,子进程如果没有马上exec而是修改了父进程出得到量值,此修改会在父进程中生效
- 设计初衷,提高系统效率,减少不必要的开销
- 现在fork已经具备读时共享写时复制机制,vfork逐渐废弃。
2.exec族
exec
exec加载一个程序,替换掉APP的代码段,堆,栈。
#include<stdio.h> #include<unistd.h> int main(void) { printf("hello\n"); execl("/bin/ls","ls","-l",NULL); //后边这一句不会再执行了 printf("world\n"); return 0; }
时间: 2024-11-10 07:25:15