linux基础知识——创建进程
1.fork函數(shù)
\qquad執(zhí)行一個可執(zhí)行的程序,就創(chuàng)建一個進(jìn)程。除此之外,還可以使用fork()函數(shù)創(chuàng)建一個子進(jìn)程。
\qquadfork函數(shù)的返回值有兩個,本質(zhì)是一個進(jìn)程變成兩個進(jìn)程,這兩個進(jìn)程各自對fork做返回:返回子進(jìn)程pid(父進(jìn)程非負(fù)整數(shù));返回0(子進(jìn)程創(chuàng)建成功)。
\qquad運行結(jié)果:
---------------------- I am parent,pid = 17257, ppid = 17200 I am child,pid = 17258, ppid = 17257 ----------------------- -----------------------\qquad在程序執(zhí)行到pid=fork()時,程序會創(chuàng)建一個子進(jìn)程,
\qquad此時父進(jìn)程的pid>0;執(zhí)行
\qquad然后繼續(xù)向下執(zhí)行
printf("-----------------------\n");\qquad此時子進(jìn)程pid=0;執(zhí)行
printf("I am child,pid = %u, ppid = %lu\n",getpid(),getppid());\qquad然后繼續(xù)向下執(zhí)行
printf("-----------------------\n");2.循環(huán)創(chuàng)建子進(jìn)程
#include<stdio.h> #include<unistd.h> int main() {pid_t pid;int i;for(i=0;i<5;i++){pid = fork();if(pid==-1){printf("錯誤\n");}else if(pid==0){break;}}if(i<5){sleep(i);printf("i am %dth child,pid=%u\n",i+1,getpid());}else{sleep(i);printf("i am parent,pid=%u\n",getpid());}return 0; }3.getuid()和getgid()函數(shù)
\qquad獲取當(dāng)前進(jìn)程的實際用戶ID:uid_t getuid(void)
\qquad獲取當(dāng)前進(jìn)程的有效用戶ID:uid_t geteuid(void)
\qquad獲取當(dāng)前進(jìn)程的使用用戶組ID:gid_t getgid(void)
\qquad獲取當(dāng)前進(jìn)程的有效用戶組ID:gid_t getegid(void)
4.父子進(jìn)程在fork()之后的異同
\qquad在fork之后:
\qquad相同點:全局變量;.data;.text;棧;堆;環(huán)境變量;用戶ID;進(jìn)程工作目錄…
\qquad不同點:進(jìn)程ID;fork返回值;父進(jìn)程ID;進(jìn)程運行時間;鬧鐘/定時器;未決信號集
\qquad父子遵循讀時共享寫時復(fù)制的原則。父子進(jìn)程共享:文件描述符(打開文件的結(jié)構(gòu)體);mmap建立的映射區(qū)。而父子進(jìn)程執(zhí)行的先后順序,取決于內(nèi)核的調(diào)度算法。
總結(jié)
以上是生活随笔為你收集整理的linux基础知识——创建进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《动手学深度学习 PyTorch版》学习
- 下一篇: Linux命令整理 —— 目录结构