進程

進程

進程(Process)是系統進行資源分配和調度的基本單位,線程是任務調度的最小單位

Linux下可以使用top命令查看系統進程運行情況

進程ID

每個進程都有一個唯一的標識符,進程ID簡稱爲PID

  • 進程ID默認的最大值爲32768,雖然PID可以修改,但是一般不這樣操作,因爲進程ID的分配是線性的
  • 除了init進程,其它進程都是被其它進程創建的;創建進程的進程稱爲父進程,被創建的進程稱爲子進程

獲取進程ID

//getpid可以獲取進程ID
//getppid可以獲取進程父進程的ID

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);		//獲取進程ID
pid_t getppid(void);	//獲取父進程ID

函數使用實例:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
		pid_t pid,ppid;
		
		pid = getpid();
		ppid = getppid();

		printf("The process pid is: %d \n",pid);
		printf("The process ppid is: %d \n",ppid);
		return 0;
}

exec函數

Linux中,可以使用exec族函數將程序載入內存,在一個可執行程序中運行其它的可執行程序

//頭文件
#include <unistd.h>

//l、p表示以列表形式還是數組形式調用參數
//p表示函數的第一個參數爲文件絕對路徑
//e表示提供新的環境變量
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 execvpe(const char *file, char *const argv[],char *const envp[]);

函數實例:

#include <stdio.h>
#include <unistd.h>

int main()
{
		if(execl("/home/linuxsystemcode/process/getpid","getpid",NULL) < 0)
			printf("The exec failed!\n");

		return 0;
}

fork函數創建子進程

fork系統調用用於創建一個新的進程,稱爲子進程。它與進程(調用fork的進程)同時運行,此進程稱爲父進程。創建完新的進程之後,二者將共同執行fork()系統調用之後的下一條指令

  • 子進程和父進程使用相同的PC(程序計數寄存器),相同的CPU寄存器
//頭文件
#include <unistd.h>

pid_t fork(void);
//函數執行成功,返回兩個值:子進程pid(父進程),0(子進程)
//函數執行失敗:返回-1,只有當內存耗盡或pid用盡的情況下fork()會失敗,一般不會發生

函數使用實例:

#include <stdio.h>
#include <unistd.h>

int main()
{
		pid_t pid;
		pid = fork();
		if(pid == 0)
				printf("This is Child!\n");
		else
				printf("This is Father!\n");
				sleep(1);				//防止父進程在沒有調用子進程之前結束

		return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章