如果我們把電腦上的作業系統及各種各樣的軟體看成一系列的有機生命,而不是指令集,那麼這就是一個進程的世界,在進程的世界中同樣有“道德”和“法製法規”,窺探進程世界,看它的俠肝義膽,風雨江湖路~~~~~
linux支援多個進程同時進行,也就是我們常說的現代作業系統中的多道程式設計,所謂同時是linux系統調度各個進程分別佔用cpu的時間。由於每個時間片的時間很小和宏觀時間相比,給人的感覺是多個進程在運行。
註:總結下就是在微觀是串列,在宏觀上是並行。
為了提高程式的運行效率,程式往往分成多個部分組成,這也就是說的並發程式設計。並發程式中各進程是相互獨立的,在必要的時候會通過相應的機制進行通訊。若進程間要共用資源,為了避免出現衝突,常通過相應通訊機制使它們輪流使用共用資源。在進程進行通訊時,會出現一個進程等另一個進程完,才能繼續啟動並執行情況,這也需要處理序間通訊以瞭解對方的運行情況。有時進程間會出現互斥現象,這是會用到鎖機制。在並發程式設計中,進程的建立和結束是由使用者決定的。這也就出現了父進程和子進程概念。
進程的建立:
#include <unistd.h> pid_t fork(void); pid_t vfork(void);
在這簡述,fork建立的子進程是父進程的一個拷貝,但是和父進程使用不同的資料區段和堆棧。vfork和fork基本相同但是vfork不會複製父進程的資料區段,它們共用資料區段。這是因為vfork常和exec函數使用去調用一個程式如ls命令,開啟一個新的進程。vfork後父進程會等待子進程運行結束或調用了exit。fork後父進程和子進程的運行順序是不確定的。
下面是體現它們性質的程式:
#include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { pid_tpid; char*pchar = "before fork"; inttest_va = 1; if((pid= fork()) < 0 ) { printf("forkerror!!\n"); exit(1); } elseif(pid == 0) { printf("childprocess\n"); pchar= "child pchr\n"; printf("%s\n",pchar); test_va= 2; printf("%d\n",test_va); _exit(2); } else { printf("parentprocess\n"); //sleep(1); printf("%s\n",pchar); printf("%d\n",test_va); } }
把上面的fork改為vfork即可
fork:
vfork:
查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm