訊號的本質:
訊號是在軟體層上對中斷機制的一種模擬。
kill
,alarm
等函式
訊號種類:
訊號分為可靠訊號和不可靠訊號
,unix系統只定義了
32種訊號,
red_hat
支援64
種訊號,訊號大於
32<=64
的為可靠訊號,其餘為不可考訊號
我主要想給大家介紹的是下面的關於訊號的幾個函式
1.kill 用於傳送訊號給指定程序
標頭檔案:#include#include
函式原型:int kill(pid_t pid, int sig)
函式引數:kill可以將引數
sig送到
pid指定的程序
pid>0 ,
將訊號傳給程序標示碼為pid的程序
pid =0,將訊號傳給和目前程序相同程序組的所有程序
pid < 0,
將訊號傳給程序標示碼為pid絕對值的程序
pid = -1,將訊號傳給系統內所有程序
返回值:成功返回0,失唄返回-1
2.alarm 設定訊號傳送鬧鐘
標頭檔案:#include
函式原型:unsigned int alarm (unsigned int seconds)
函式引數:seconds為
0,鬧鐘取消,
返回值:返回之前剩餘秒數,如果之前沒設鬧鐘,返回0;
3.signal 傳送訊號給指定程序
標頭檔案:#include
函式原型:
void(*signal(int signum,void (*handler)(int)))(int) == signal(int signum,sighandler_t handler)
函式引數:handler:寫函式名,
signum
:siging
,sigqouit等等
返回值:返回之前剩餘秒數,如果之前沒設鬧鐘,返回0
4.pause 讓程序暫停,直到訊號出現
標頭檔案:#include
函式原型:int pause(void)
返回值:-1
下面是個例子用到了2,3,4三個函式
#include#includevoid handler()
int main()
pause();
exit(0);
}
共享記憶體:
1.shmget 在核心中建立共享記憶體
標頭檔案:#include#include
函式原型:int shmget(key_t key,int size,int shm***)
引數:key:鍵值,
ipc_private
私有鍵值
size:建立的記憶體大小
shm***:標誌,同
open
()的許可權位
返回值:
成功:返回共享記憶體識別符號,失敗-1;
2. shmat: 對映共享記憶體,對映到各自記憶體空間
標頭檔案: #include#include#include
函式原型:void *shmat(int shmid,const void *shmadder,int shm***)
引數:shmid:記憶體識別符號,
shmadder
核心進行自動分配,shm***,
shm_rdonly
唯讀,為
0 表示可讀寫。
3.shmdt 撤銷共享記憶體的對映
函式原型:int shmdt (const void * shmadder)
引數: shmadder:被對映的共享記憶體位址
返回值:成功0,出錯-1
共享記憶體實現步驟
建立共享記憶體->對映共享記憶體
->
撤銷對映操作
#include #include #include #include #include #include #include #include "shm_com.h"
int main(void)
/*對映共享記憶體*/
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memory==(void *)-1)
printf("memory attached at %x\n",(int)shared_memory);
/*讓結構體指標指向這塊共享記憶體*/
shared_stuff=(struct shared_use_st *)shared_memory;
/*控制讀寫順序*/
shared_stuff->written_by_you=0;
/*迴圈的從共享記憶體中讀資料,直到讀到「end」為止*/
while(running)
}} /*刪除共享記憶體*/
if(shmdt(shared_memory)==-1)
exit(exit_success);
}
#include #include #include #include #include #include #include #include "shm_com.h"
int main(void)
/*對映共享記憶體*/
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memory==(void *)-1)
printf("memory attached at %x\n",(int)shared_memory);
/*讓結構體指標指向這塊共享記憶體*/
shared_stuff=(struct shared_use_st *)shared_memory;
/*迴圈的向共享記憶體中寫資料,直到寫入的為「end」為止*/
while(running)
printf("ener some text:");
fgets(buffer,bufsiz,stdin);
strncpy(shared_stuff->some_text,buffer,text_sz);
shared_stuff->written_by_you=1;
if(strncmp(buffer,"end",3)==0)
}/*刪除共享記憶體*/
if(shmdt(shared_memory)==-1)
exit(exit_success);
}
Linux C 程序間的訊號通訊
1 訊號通訊 核心中存在64種訊號,即linux 核心可以傳送64種訊號,命令 kill l 可以檢視 a 訊號的傳送 kill raise alarm kill pid t pid,int sig raise int sig 等價於 kill getpid int sig 即發給自己 附 終止程序...
linuxC多程序通訊systemv 共享記憶體
共享記憶體通訊限制 舉例 獲取共享記憶體物件的id int shmget key t key,size t size,int shm 對映共享記憶體 void shmat int shmid,const void shmaddr,int shm 解除記憶體對映 int shmdt const voi...
LINUX C 語言 程序管理(一)
子程序和父程序的開始與結束 子程序結束的時候會向父程序傳送訊號,讓父程序幫助 程序 父程序先結束的時候,子程序會過繼到init程序下 即指定init程序為新的父程序 如果父程序因為各種原因沒有收到子程序傳送的訊號,則無法 子程序的資源,子程序會成為殭屍程序 子程序與父程序的資源 程序的記憶體區劃分 ...