再談‘進程’

★進程標識符
   算法

        每一個進程都有非負的×××表示惟一的進程ID。下面是一些標識符:
               pid:調用進程的ID(獲取方式getpid)
                 ppid:調用進程的父進程ID(獲取方式getppid)
                 uid:調用進程的實際用戶ID(獲取方式getuid)
                 euid:調用進程的有效用戶ID(獲取方式getuid)
                 gid:調用進程的實際組ID(獲取getgid)
                 egid:調用進程的有效組ID(獲取getegid)
ide


例:用fork建立子進程,查看父子進程的pid、ppid、uid、euid。函數

wKiom1eWskSyDJZpAAC-KLZHQyU880.png


運行結果:ui

wKioL1eWsoKBdaqHAAAehicexjE096.png



★進程建立spa

      上篇博客中提到可使用fork( )和execve( )來建立,咱們可以知道fork後的子進程可以得到父進程的數據空間、堆、棧的副本,父子進程同時共享文本段。因此說:子進程不能改變父進程中某個變量的值,內核只能修改內存副本中該變量的值。3d


例:blog

wKioL1eWwIHB7kAfAACR9HwHWXI735.png


運行結果:進程

wKioL1eWwOrBVK8UAAAn9l7UbCo516.png


      由上面的程序結果可以看到,子進程對變量的值進行更改,可是並無影響到父進程中變量的值。通常父進程和子進程執行的前後順序是不肯定的,取決於系統的調度算法。上面的程序父進程先sleep,使得子進程先執行。內存


     這裏再介紹一下vfork( )函數,vfork和fork都可以建立一個子進程,可是vfork的子進程不會將父進程的地址空間進行復制,因此子進程會先執行,在其調用exec後或者exit後,父進程才能夠執行。get


例:

wKiom1eWyLnRll-_AACqfNIUjVw365.png


運行結果:

wKiom1eWyTORdIL4AAAgTI5gaBM129.png



★進程等待

     進程等待可使用兩個函數wait和waitpid。調用以後會產生如下的一些狀況:

             (1)若是全部的子進程都處於運行狀態,則會阻塞。

               (2)若是一個子進程已經終止,正在等待父進程獲取其狀態,則取得該子進程的終止狀態當即返回。

               (3)若是它沒有任何的子進程,則當即出錯返回。


頭文件:#include <sys/types.h>                  #include <sys/wait.h>                

              ① pid_t wait (int* status);

              ②pid_t waitpid(pid_t pid, int* status, int options);


     wait函數若是成功,則返回被等待進程的pid,失敗返回-1,waitpid函數正常返回收集到的子進程的ID,失敗返回-1.

相關文章
相關標籤/搜索