TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态
TCP/IP,Linux下多進程編程,進程復制函數fork,雙返回值函數,通過父進程復制一份代碼相同的子進程,父子進程執行順序由調度算法決定,代碼中獲取進程執行用戶的函數,數據共享狀態
一、Linux多進程編程:
1、Linux多進程編程中,一個進程產生另一個進程,需要使用fork函數,fork函數可以在代碼中復制一個子進程,
2、fork()以后的代碼被父子進程執行,fork()以前的代碼只被父進程執行,
3、使用man fork查看fork的頭文件以及聲明。
二、fork雙返回值使用方法:
1、返回值有兩個,分別是子進程的pid和0,在當前進程(父進程)中會返回創建的子進程的pid,在創建的子進程中會返回0,將返回值與0進行比較可以區分子進程和父進程,并執行不同的操作。
2、創建失敗時則會返回-1
3、Linux下的所有進程都是由父進程bash一一fork出來的。
三、驗證函數:
1、getpid()獲取當前進程的pid
2、getppid()獲取當前進程的父進程的pid
注意,當子進程獲取父進程的pid時,如果父進程已經運行完畢,獲得的父進程的pid就是1(bash進程)或者其他值,否則就是父進程的pid。
四、循環創建進程:
1、如果在for或者while循環中fork新的進程,創建出來的進程數量將是2^n - 1,類似于兔子生孩子的情況,為了避免創建出一大堆進程,每次創建出來的進程都需要及時break。
2、創建完畢后可以通過計數器i與n比較區分父進程和子進程。
五、父子進程的執行順序:
父進程創建出子進程后,會共同搶占CPU資源,結果隨機,如果想要控制兩者的運行順序,需要使用sleep使某個進程睡眠指定時間,或者阻塞,已達到控制運行順序的效果,內核使用的調度算法決定進程的執行先后。
六、通過代碼獲取當前運行時用戶:
uid_t getuid得到實際用戶id,例如sudo命令下,會得到實際的用戶uid,而不是root
uid_t geteuid得到有效id,sudo命令下,得到root的id,主要是區分su,sudo提權獲取的用戶。
七、進程數據共享狀態:
1、父子進程擁有相同的代碼,但子進程只會執行fork自己往后的代碼。
2、父子相同處:
全局變量,.data,.text,堆棧,環境變量,用戶ID,進程工作目錄,信號處理方式
3、父子不同處:
進程ID,fork返回值,父進程id,進程運行時間,鬧鐘(定時器),未決信號集。
4、父子進程之間,讀共享,寫復制,子進程中沒有寫操作的數據,是共享的物理地址,子進程中發生了寫操作的數據,是復制了內容的獨立物理地址。
5、父子進程共享的數據:文件描述符(打開文件的結構體),mmap建立的映射區(用于進程間通信)。
6、0-4G的虛擬地址中,0-3G是一樣的,3-4G的進程有關信息是不一樣的。
總結
以上是生活随笔為你收集整理的TCP/IP,Linux下多进程编程,进程复制函数fork,双返回值函数,通过父进程复制一份代码相同的子进程,父子进程执行顺序由调度算法决定,代码中获取进程执行用户的函数,数据共享状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工势场法
- 下一篇: Linux的使用_尚硅谷视频学习笔记