創建子進程:fork調用,
一次fork調用返回兩個值,1、返回子進程的pid(非負整數)
? ?2、返回0
父進程的fork返回子進程的id,子進程的fork返回0(表示執行成功)
?
創建單個子進程:
pid_t pid;pid = fork();if(pid == -1){perror("fork error");exir(1);}else if(pid == 0){printf("I`m child pid = %u\n, ppid = %u\n", getpid(), getppid());}else{printf("I`m parent pid = %u\n, ppid = %u\n", getpid(), getppid());}
循環創建多個子進程
for(...)
{
上述代碼...在子進程中加入break
}
?
進程的有效用戶與實際用戶:當使用sudo后有效用戶是root,實際用戶是lr
uid_t getuid(void) //獲取實際用戶id
uid_t geteuid(void) //獲取有效用戶id
?
fork之后父子進程相同處:全局變量、.data(各自一份)、 .text、棧、堆、環境變量、用戶id、宿主目錄、進程工作目錄、信號處理方式
不同處:進程id、fork返回值、進程運行時間、鬧鐘、未決信號集、各自的父進程id
全局變量各自獨立,不互相影響
父子進程間遵循讀時共享,寫時復制的原則。父子進程讀共有的數據時、使用同一數據。當有寫操作時,復制一份數據各自使用。
重點:共享文件描述符(打開文件的結構體),可以操作同一個文件
mmap建立的映射區(通信使用)
?
gdb調試? 默認跟蹤的是父進程。
set follow-fork-mode child命令設置gdb在fork之后跟蹤子進程
set follow-fork-mode parent 設置跟蹤父進程
要在fork函數調用之前設置
?
孤兒進程、僵尸進程
孤兒進程: 父進程先于子進程結束,則子進程成為孤兒進程,子進程的父進程成為init進程,稱為init進程領養孤兒進程。
?
僵尸進程: 進程終止,父進程尚未回收,子進程殘留資源(PCB)存放于內核中,變成僵尸(Zombie)進程。
?
特別注意,僵尸進程是不能使用kill命令清除掉的。因為kill命令只是用來終止進程的,而僵尸進程已經終止。
?