【摘要】 介紹Linux下進程概念、進程信號捕獲、進程管理相關的命令的使用等知識點。
任務 1: 進程編程
1.1 進程概念
./a.out //沒有運行之前就是靜態程序,運行之后就是一個進程
怎么區分進程?能夠獨立運行的程序,main。
每個進程都有自己唯一的PID號。
命令行可以通過ps命令獲取后臺進程的PID號。
1.?示例:ps -e 查看后臺全部進程
#include #include pid_t getpid(void); //獲取進程PID pid_t getppid(void); |
??C語言代碼方式獲取PID
#include #include #include int main(int argc,char **argv) { pid_t pid=getpid(); printf("當前進程PID=%d ",pid); pid=getppid(); printf("PPID=%d \n",pid); return 0; } |
1.2 進程的信號
kill 命令功能:給程序發送信號。
查看所有支持的信號:kill -l
kill [-s signal|-p] [--] pid... kill -l [signal] :查看指定信號的幫助信息 |
發送信號的方式:
1.?kill <進程PID> //默認發送的進程終止信號,示例: #kill 348374
2.?kill -s <具體信號> <進程的PID> 示例: #kill -s SIGINT 7646
3.?kill -<具體信號> <進程的PID > 示例: # kill -SIGINT 7734
??信號的捕獲
#include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t han-dler); 參數: int signum :要捕獲的信號 sighandler_t han-dler:函數指針 |
??信號的捕獲示例
#include #include #include #include void sighandler(int sig) { printf("捕獲的信號值=%d\n",sig); } int main(int argc,char **argv) { //將指定信號綁定到指定的函數上 signal(SIGINT,sighandler); //2 signal(SIGIO,sighandler); //29 signal(SIGSYS,sighandler); //31 while(1) { sleep(5); } return 0; } |
Linux系統和windows這些系統屬于非實時系統。 ucos\uclinux系統屬于實時系統 |
??josb查看后臺運行的程序作業代號。
??fg 1 將后臺作業代號為1的程序切換到前臺運行
??當程序在前臺運行時,按下 ctrl+z 可以將程序放入后臺,并且暫停運行。
??bg 1 將后臺暫停的程序切換為運行狀態
1.3 進程的創建
#include #include #include #include int main(int argc,char **argv) { pid_t pid; pid=fork(); //創建一個新的進程 if(pid==0) //子進程 { printf("子進程pid=%d\n",getpid()); } else if(pid>0) //父進程 { printf("父進程pid=%d\n",getpid()); } else //進程創建錯誤 { printf("進程創建失敗!\n"); } return 0; } |
fork 函數創建新進程本身屬于一個拷貝的過程。繼承功能!
??進程的退出
#include #include #include #include #include void print(void); int main(int argc,char **argv) { print(); printf("main函數執行!"); return 0; } void print(void) { printf("子函數執行!"); //return; //終止函數,會將緩沖區里的數據輸出 //exit(0); //直接終止進程,會將緩沖區里的數據輸出 _exit(0); //強制終止進程,銷毀緩沖區中的數據 } |
??查看僵尸進程:ps -aux
??查看系統的環境變量: env
??修改控制臺終端的環境變量:export PS1='[\u@\h \W \t]\$'
1.4 進程的執行
#include int system(const char *command); // “ls -l” …..”cd” |
接收命令的返回值:
#include int main(int argc,char **argv) { system("pwd >123.txt"); //獲取腳本或者其他程序的返回值 return 0; } |
??可變形參
#include void func(int data,...); int main(int argc,char **argv) { int data=888; func(data,123,456,789,100); return 0; } void func(int data,...) { int i=0; int *p=&data; for(i=0;i<5;i++) { printf("%d\n",*p++); } } |
??執行進程
#include #include int main(int argc,char **argv) { execl("/bin/ls","ls","-l",NULL); printf("123\n"); return 0; } #include #include int main(int argc,char **argv) { execlp("ls","ls","-l",NULL); //PATH=xxx:xxx:xxx: printf("123\n"); return 0; } |
??管道:FIFO--->先入先出
通過命令行: mkfifo命令可以直接創建FIFO文件。
無名管道的FIFO文件不是實體文件,存在內存中的。
文件的方向: 即 fds[0]和讀端相對應, fds[1]和寫端相對應
有名管道的FIFO文件是實體文件,存在硬盤中的。
#include #include /* #include int pipe(int pipefd[2]); */ int main(int argc,char **argv) { int pipefd[2]; char buff[100]; pipe(pipefd); //創建一個無名管道 [0]讀 [1]寫
int pid=fork(); if(pid) //父進程 { while(1) { write(pipefd[1],"12345",6); sleep(1); } } else //子進程 { while(1) { read(pipefd[0],buff,100); printf("buff=%s\n",buff); } } return 0; } |
1.5 練習
1. 練習無名管道的通信,刪除指定目錄下的指定后綴的文件。
要求:子進程負責遍歷文件,父進程就負責刪除文件。
#include
#include
#include
#include
/*
無名管道:
fds[0] 表示讀
fds[1] 表示寫
int dup2(int oldfd, int newfd); //實現文件描述符的重定向
示例: dup2(fds[1],1); //將本程序的標準輸出定義到管道的寫端
標準輸入:0
標準輸出:1
標準錯誤:2
*/
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("參數格式: ./app <傳入一個文件>\n");
exit(-1); //退出進程
}
int fds[2]; //定義了管道文件
pipe(fds); //創建無名管道文件
char buff[100];
char cmd[100];
int status;
int pid=fork();
int len;
if(pid==0) //子進程,遍歷目錄,查找文件
{
write(fds[1],argv[1],strlen(argv[1])); //寫入數據
/*
1. 定義一個二維數組,先將所有目錄遍歷完畢,將得到數據一次性寫過去
2. 遍歷一個就寫一個。(編寫一個應答機制)
*/
}
else if(pid>0) //父進程,負責刪除文件
{
len=read(fds[0],buff,100);
buff[len]='\0';
strcpy(cmd,"rm ");
strcat(cmd,"-rf ");
strcat(cmd,buff);
printf("cmd=%s\n",cmd);
system(cmd); //執行最終的操作
wait(&status); //隨機等待一個子進程退出
}
else
{
printf("進程創建失敗!\n");
exit(-1);
}
return 0;
}
2. 練習命名管道的通信,刪除指定目錄下的指定后綴的文件。
要求:子進程負責遍歷文件,父進程就負責刪除文件。
dup2(fd_pipe[1],1); //將子進程的標準輸出重定向到管道的寫端
3. (擴展) 通過命名管道實現本地聊天室,一個終端界面表示一個用戶。
注明: 就一個.c程序,運行一個就是一個新的用戶,每個進程之間通過命名管道通信。
(1) 每次運行程序需要輸入用戶名創建用戶名。
(2) 每個新加入一個用戶有歡迎提示,例如: 歡迎xxx加入xxx聊天室。
(3) 可以互相發送內容,發送內容時的格式: <用戶名>: <實際內容>:<發送的時間>
(4) 可以顯示在線人數。
(5) 一個用戶發送內容,所有的用戶都可以顯示出來。
(6) 通過一個文件保存聊天記錄。
-
Linux
+關注
關注
87文章
11123瀏覽量
207908 -
編程
+關注
關注
88文章
3521瀏覽量
93268 -
進程
+關注
關注
0文章
197瀏覽量
13928
發布評論請先 登錄
相關推薦
評論