相關函數
- fork():創建一個新進程
- wait():用於阻塞,控制子進程和父進程同步
- exit():進程結束
- kill():刪除執行中的程序或者任務
- signal():允許調用進程控制軟中斷信號的處理
- pipe():創建一個管道
進程的軟中斷實驗
用fork創建兩個子進程,在從系統調用signal讓父進程捕捉鍵盤上的中斷信號,當接收到軟中斷後,父進程用kill中斷兩個信號。
#include<stdio.h>//exit()
#include <stdlib.h>//exit()
#include<signal.h>//signal()
#include<unistd.h> //pipe()
#include<sys/types.h>//wait()
int wait_flag;
void stop();
main(){
int pid1,pid2;//定義兩個進程變量
signal(3,stop);//鍵盤按Quit鍵
while((pid1=fork())==-1);//創建子進程1不成功,則空循環
if(pid1>0){
while((pid2=fork())==-1);
if(pid2>0){
wait_flag=1;
sleep(5);//父進程等待五秒
kill(pid1,16);//殺死進程1
kill(pid2,17);//殺死進程2
wait(0);//等待第一個進程結束的信號
wait(0);//等待第二個進程結束的信號
printf("\n Parent process is killed !!\n");
exit(0);
}
else{
wait_flag=1;
signal(17,stop);//等待進程2被殺死的中斷號17
printf("\n Child process 2 is killed by parent !!\n");
exit(0);
}
}
else{
wait_flag=1;
signal(16,stop);//等待進程1被殺死的中斷號16
printf("\n Child process 1 is killed by parent !!\n");
exit(0);
}
}
void stop(){
wait_flag=0;
}
進程的管道通信實驗
使用系統調用pipe建立一條管道,父進程從管道中讀出來自兩個子進程的消息,顯示在屏幕上。
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include <stdlib.h>
#include <stdlib.h>
int pid1,pid2;//定義兩個進程變量
main(){
int fd[2];
char OutPipe[100],InPipe[100];//定義兩個字符數組
pipe(fd);//創建管道
while((pid1=fork())==-1);//如果進程1創建不成功,則空循環
if(pid1==0){
lockf(fd[1],1,0);//鎖定管道
sprintf(OutPipe,"\n Child process 1 is sending message !\n");
write(fd[1],OutPipe,50);//向管道寫入數據
sleep(5);
lockf(fd[1],0,0);//解除管道鎖定
exit(0);//結束進程1
}
else{
while((pid2=fork())==-1);//如果進程2創建不成功,則空循環
if(pid2==0){
lockf(fd[1],1,0);
sprintf(OutPipe,"\n Child process 2 is sending messagec !\n");
write(fd[1],OutPipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else{
wait(0);
read(fd[0],InPipe,50);
printf("%s\n",InPipe);
wait(0);
read(fd[0],InPipe,50);
printf("%s\n",InPipe);
exit(0);
}
}
}