簡單理解為,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前操作系統中一個進程的情況。
對於單 CPU的情況而言,每一特定時刻只有一個進程占用 CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。
fork()用於從已存進程中建立一個新進程,新進程為子進程,老進程為父進程.可以通過檢查"fork()"地返回值知道哪個是子進程哪個是父進程。父進程得到的返回值是子進程的進程號,而子進程則返回0。
基本模式是:
#include
#include
#include
#include
#include
#include
main()
{
pid_t pid;
int rv;
pid=fork(); //創建進程
switch(pid)
{
case -1: //返回-1的話,進程創建沒成功
perror("fork");
exit(1);
case 0:
printf(" CHILD: This is the child process!\n");
printf(" CHILD: My PID is %d\n", getpid()); //調用 getpid 得到自己的 PID
printf(" CHILD: My parent's PID is %d\n", getppid()); //getppid() 得到父進程的 PID
printf(" CHILD: Enter my exit status (make it small): ");
scanf(" %d", &rv);
printf(" CHILD: I'm outta here!\n");
exit(rv);
default:
printf("PARENT: This is the parent process!\n");
printf("PARENT: My PID is %d\n", getpid());
printf("PARENT: My child's PID is %d\n", pid); //fork() 返回的default值意味著你正在父進程中,返回值是子進程的 PID 。這是得到子進程 PID 的唯一方法
printf("PARENT: I'm now waiting for my child to exit()...\n");
wait(&rv); //父進程必須等待子進程完成收拾子進程的殘余後才能繼續
printf("PARENT: My child's exit status is: %d\n", WEXITSTATUS(rv)); 也就是父進程不能先於子進程消亡。
printf("PARENT: I'm outta here!\n");
}
}
//EXITSTATUS() 是一個宏,從 wait() 返回值中提取實際的返回值。
// wait() 怎麼知道在哪個進程上等待?我的意思是,由於父進程可以有多個子進程, wait() 實際等待地是哪一個?答案非常簡單,它等待最先退出的那一個。你可以通過以子進程的 PID 為參數調用 waitpid() 指明是哪一個子進程。
if (!fork())
{
printf("I'm the child!\n");
exit(0);
} else
{
printf("I'm the parent!\n");
wait(NULL);
}
linux 是多用戶和多進程的操作系統,進程在操作系統中的創建,都會生成一個進程描述塊,描述當前進程的所有信息,包括,數據段、代碼段、堆棧段的地址,當前進程的環境變量,文件描述符等。
fork函數過程:操作系統先創建一個進程描述塊,然後把父進程的所有進程描述符的信息精確拷貝過來,和父進程一樣(除了進程ID不一樣外),代碼段共享,數據段和堆棧段復制,所有的寄存器的值全部精確拷貝,文件描述符也許精確拷貝。
fork的返回值,fork在父進程空間中返回子進程的PID,在子進程空間中返回0