本來想現在Linux上熟悉下進程的有關概念然後去寫windowsSDK的,沒想到今天Windows藍屏了,新升級的3.2.2內核打開虛擬機的時候還要升級內核。升就升吧,沒想到還錯誤了。沒辦法,看來只好在Linux上面待著了。
這幾天自己只是熟悉了下進程的概念,然後簡單的寫了一些小程序。自己寫點筆記免的忘掉。
進程標識符:Linux環境下進程啟動時候,系統分配給一個唯一的數值給每個進程,這個數值就稱為進程標識符。(感覺跟windows裡面的句柄有點像)
進程表示有進程號 PID 和 父進程號 PPID,都是非0整數
使用函數getpid獲得當前進程號,
函數原型Pid_t getpid(void);
使用函數getppid獲得當前進程的父進程號
函數原型Pid_t getppid(void);
下面介紹LinuxC下與進程相關的函數
exec函數族 在進程中啟動另一個程序執行
這個函數族有6個成員
exec函數族函數原型
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
其中只有execve是真正意義上的系統調用,其它都是在此基礎上經過包裝的庫函數。system 在進程中開始另一個進程
函數原型
#i nclude<stdlib.h>
int system(const char * string);
函數說明
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間 SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值
=-1:出現錯誤
=0:調用成功但是沒有出現子進程
>0:成功退出的子進程的id
fork 從已存在的進程中復制一個新進程(這個進程叫做原來父進程的子進程)
這是個關鍵的函數,理解了這個函數也就是進程入門了吧,呵呵
廢話不多說,先來看看函數原型:
#include<unistd.h>
#include<sys/types.h>
pid_t fork( void); (pid_t 是一個宏定義,其實質是int 被定義在#include<sys/types.h>中)
返回值: 若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程ID;否則,出錯返回-1
函數說明: 一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。兩次返回的唯一區別是子進程中返回0值而父進程中返回子進程ID。
子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間。
Linux將復制父進程的地址空間內容給子進程,因此,子進程有了獨立的地址空間。
我當初一直難以理解的fork函數的返回值。先看下示例代碼:
[cpp]