Linux開發_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
2. 練習命名管道的通信,刪除指定目錄下的指定后綴的文件。
要求:子進程負責遍歷文件,父進程就負責刪除文件。
dup2(fd_pipe[1],1); //將子進程的標準輸出重定向到管道的寫端
3. (擴展) 通過命名管道實現本地聊天室,一個終端界面表示一個用戶。
注明: 就一個.c程序,運行一個就是一個新的用戶,每個進程之間通過命名管道通信。
(1) 每次運行程序需要輸入用戶名創建用戶名。
(2) 每個新加入一個用戶有歡迎提示,例如: 歡迎xxx加入xxx聊天室。
(3) 可以互相發送內容,發送內容時的格式: <用戶名>: <實際內容>:<發送的時間>
(4) 可以顯示在線人數。
(5) 一個用戶發送內容,所有的用戶都可以顯示出來。
(6) 通過一個文件保存聊天記錄。
Linux 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。