Unix環境高級編程之進程控制

<span style="font-size:18px;">1.什麼是進程</span>
執行的程序:代碼->資源->CPU
進程由很多數據維護:進程狀態/進程屬性
所有的進程屬性採用結構體維護->樹性數據結構
ps 察看進程的屬性
ps a   所有的進程
ps au  所有用戶的進程
ps aue 所有用戶的所有有效進程


進程狀態: X死亡 Z殭屍 man ps 查看所有的進程狀態屬性
top 察看系統進程執行狀況
pstree 查看進程中的進程樹(ptree UNIX)
kill   向進程發送信號
kill -s 信號  進程ID

kill -l 顯示進程能接受的所有信號


2.進程相關函數

1>int System(const char* command)

功能:使用System()函數創建新的進程

example:

<span style="white-space:pre">	</span><pre name="code" class="plain"><span style="font-size:18px;">#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
//system可以調用一個程序,從而創建一個進程,進程的返回碼即程序的返回值
//存放在8~15位內,任何一個進程的返回值不要超過255,是一個字節
//int system(const char* command)
//注意阻塞,必定被調用程序先返回後在返回.
main()
{
      int r;
	  printf("%d\n",getpid());
	  r = system("./main");
	 // printf("%d\n",r>>8&255);
	 printf("%d\n",WEXITSTATUS(r));
	 
}</span>


2>popen:創建子進程  在父子進程之間建立一個管道.

FILE* popen(const char* command,const char* type)

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
//FILE* popen(const char* command,const char* type)
main()
{
	char buf[1024];
	FILE* f = popen("gcc test.c -otest","w");		
    
	int fd = fileno(f);
	
	int r;

	printf("================\n");
	while((r=read(fd,buf,1024))>0)
	{
		 buf[r]=0;
		 printf("%s\n",buf);
	}
	printf("==================\n");
    
	close(fd);
	pclose(f);
	
}

3>execl系列函數

使用exec執行一個程序
體會:是否創建新的進程?  NO
 體會execl的參數的命令行的格式
 體會execl與execlp的區別     
  execl只認當前路徑,execlp使用系統的路徑(which)
 體會execl替換當前進程的代碼

<span style="font-size:18px;">#include <unistd.h>
#include <stdio.h>
// execl不會創建新的進程,execl只認當前路徑,execlp使用系統的路徑
/*
	int execl(
			"/bin/ls", 命令指向的程序
			"ls",      命令行
			"-l"	   選項參數
			null	   
			)
 int execlp("ls","-l",NULL) 系統使用系統路徑
*/
int main()
{
		//printf("%d\n",getpid());
		
		int r = execl( "~/mylinux/day05",// 命令指向的程序
						"./test",// 命令本身
						 "",   // 命令參數
						NULL);
		printf("over:%d\n",r);
		return 0;
		
}</span>
4>pid_t  fork(void)

//1.創建進程?
//2.新進程的代碼是什麼:克隆父進程的代碼,
並且克隆代碼執行位置
//3.在子進程不調用fork所以返回值=0;
//4.父子進程同時執行,執行先後順序不一定.

以下摘自Unix環境高級編程:

fork創建新進程被稱爲子進程,fork函數被調用一次,但是返回兩次.兩次返回的唯一區別是子進程的返回值是0,而父進程返回的是新子進程的進程ID。父子進程繼續執行fork調用後的指令.子進程是父進程的副本。父子進程共享正文段,但是子進程獲得父進程的數據空間,堆和棧的副本.

fork之後經常跟着exec,所以現在很多實現並不執行一個父進程數據段,堆棧的完全複製,作爲替代,使用了寫時複製技術。

#include <unistd.h>
#include <stdio.h>
//pid_t fork(void)
//創建新的進程,克隆父進程的代碼,和執行位置
//子進程死亡,不佔用cpu,但是佔用進程樹上的結構資源 最好調用wait來清理
//父進程死亡,直接掛載根進程下
int main()
{
	int pid;	
	printf("創建進程前!\n");
	pid = fork();
	
	printf("%d\n",pid);
	
	if(pid == 0)
	{
		while(1){
		printf("子進程\n");	
		sleep(1);
		}
	}

	else
	{
			while(1){
			printf("父進程\n");
			sleep(1);
			}
	}
	
	return 0;		

}
3.應用進程
使用fork創建新的進程有什麼新的應用價值呢?
使用fork來實現多任務.(Unix系統本身不支持線程)
1.進程
2.線程
3.信號
4.異步
5.進程池與線程池



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