linux學習之進程篇(二)
阿新 • • 發佈:2017-11-10
通過 passwd 查看 現在 替換 cnblogs exe -1 stdio.h
進程原語
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; }
linux學習之進程篇(二)