linux進程通信實例詳解

一管道通信實例分析

(1)無名管道pipe_rw.c--創建管道用pipe

【1】pipe_fd[2]數組中,pipe_fd[0]-頭部-讀信號;pipe_fd[1]-尾部-寫信號

【2】在系統調用fork()錢調用pipe()創建管道,否則子進程將不會繼承文件描述符

【3】子進程睡眠2秒sleep(2);因爲子進程是讀的,應父進程先寫,所以睡眠2秒,把CPU讓給父進程

【4】

 

(2)有名管道fifo_read.c--創建管道用mkfifo

【1】 /*打開管道*/
 fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);//O_NONBLOCK,非阻塞

【2】 memset(buf_r,0,sizeof(buf_r));把首指針爲buf_r,大小爲size的內存,全部寫入0

【3】讀一次就讀完了,在讀爲空

二信號通信實例解析-signal

mysignal.c--用戶按下某個鍵時,產生信號通信

【1】ps aux//查看當前進程的ID號

【2】kill -s SIGINT 3435///-s 指定要通信的信號////最後3435是要傳送給的pid進程

【3】

三共享內存

創建共享內存使用shmget,映射用shmat

【1】 if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)

當key取IPC_PRIVATE,將創建一塊新的共享內存

#define PERM S_IRUSR|S_IWUSR

【2】if(fork()) // 父進程寫,因爲父進程的>0

【3】 p_addr=shmat(shmid,0,0);

//shmid是shmget函數返回的共享存儲標識符

//中間的0表示,系統自動幫你找個地址

//p_addr返回的地址,對它進行操作memset來清除

【4】 sleep(1); // 暫停1秒  ,防止子進程先運行

【5】  printf("Client get %s\n",c_addr);//這裏得到的是字符串

  printf("Client get %p\n",c_addr);//這裏得到的是指針值的地址

消息隊列

目前主要有兩種類型:POSIX消息隊列和系統V消息隊列

【1】msgid=msgget(key,IPC_CREAT|0666); /*通過文件對應msgget打開key 對應的文件,並把id返回 */

【2】消息格式
struct msgbuf
{
long mtype;//消息類型>0,類型只能有一個,收發都用通一個類型
char data[255];//數據
}

【3】msgsnd發送,msgrcv接收

[4]memset(&msgbuf,0,sizeof(msgbuf));

接收前,先定義內存空間位置.

 

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