一管道通信實例分析
(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));
接收前,先定義內存空間位置.
五