歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux C編程學習:進程,進程,進程!

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"); 
        printf("%s\n",pchar); 
        printf("%d\n",test_va); 
    }   
}

fork:

vfork:

Copyright © Linux教程網 All Rights Reserved