这两天学习的东西有点多,,感觉完全应付不过来了,一直在消化这几天学习的东西所以
主要学习了
总结IPC前先复习一下多进程:
一、进程创建:
1、system函数
通过调用–cexecve(“/bin/sh”,..)函数来实现的。通过
2、fork函数
在
forkvfork函数)
3、exec函数族
exec*由一组函数组成
intexecl(constchar*path,constchar*arg,…)
exec
path是包括执行文件名的全路径名
arg
二、共享内存与信号量
共享内存机制主要用到shmgetshmatshmdtshmctl函数;
原理及实现:
shmget通过关键字建立共享内存;
shmat返回共享内存地址
shmdt断开与共享内存的链接
Shmctl回收共享内存
三、IPC
头文件:
#ifndef__CLINET_H__
#define__CLINET_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
typedefstructtag
{
intm_flag;
charm_buf[1024];
}MBUF,*pMBUF;
voidP(intsemid);
voidV(intsemid);
#endif
客户端输入端:
/*************************************************************************
>FileName:client_in.c
>Author:Comst
>Mail:750145240@qq.com
>CreatedTime:Wed04Feb201503:04:39PMCST
************************************************************************/
#include"client.h"
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/fcntl.h>
#definePATH"/home/comst/pipe"
#defineSERVER"server.fifo"
intmain(intargc,char*argv[])//shm_keysem_key
{
charserver_name[128]="";
charread_file[128],write_file[128];
charmsg[32]="";
intfd_r,fd_w;
sprintf(server_name,"%s/%s",PATH,SERVER);
intfd_server=open(server_name,O_WRONLY);
memset(read_file,0,128);
memset(write_file,0,128);
sprintf(read_file,"%s/%d_r.fifo",PATH,getpid());
sprintf(write_file,"%s/%d_w.fifo",PATH,getpid());
mkfifo(read_file,0666);
mkfifo(write_file,0666);
sprintf(msg,"%d\n",getpid());
write(fd_server,msg,strlen(msg));
fd_r=open(read_file,O_RDONLY);
fd_w=open(write_file,O_WRONLY);
key_tshm_key,sem_key;
intmy_shm,my_sem;
charline[1024];
pMBUFp;
shm_key=(key_t)atoi(argv[1]);
sem_key=(key_t)atoi(argv[2]);
my_shm=shmget(shm_key,sizeof(MBUF),0666|IPC_CREAT);
my_sem=semget(sem_key,1,0666|IPC_CREAT);
semctl(my_sem,0,SETVAL,1);
p=(pMBUF)shmat(my_shm,NULL,0);
memset(p,0,sizeof(MBUF));
while(memset(line,0,1024),fgets(line,1024,stdin)!=NULL)
{
write(fd_w,line,strlen(line));
memset(line,0,1024);
read(fd_r,line,1024);
while(P(my_sem),p->m_flag==1)
{
V(my_sem);
sleep(1);
}
strcpy(p->m_buf,line);
p->m_flag=1;
V(my_sem);
}
while(P(my_sem),p->m_flag==1)
{
V(my_sem);
sleep(1);
}
strcpy(p->m_buf,"over");
p->m_flag=1;
V(my_sem);
sleep(3);
shmdt(p);
shmctl(my_shm,IPC_RMID,NULL);
semctl(my_sem,0,IPC_RMID);
}
客户端输出端:
/*************************************************************************
>FileName:client_out.c
>Author:Comst
>Mail:750145240@qq.com
>CreatedTime:Wed04Feb201503:04:39PMCST
************************************************************************/
#include"client.h"
intmain(intargc,char*argv[])//shm_keysem_key
{
key_tshm_key,sem_key;
intmy_shm,my_sem;
charline[1024];
pMBUFp;
shm_key=atoi(argv[1]);
sem_key=atoi(argv[2]);
my_shm=shmget(shm_key,sizeof(MBUF),0666);
my_sem=semget(sem_key,1,0666);
semctl(my_sem,0,SETVAL,1);
p=(pMBUF)shmat(my_shm,NULL,0);
memset(p,0,sizeof(MBUF));
while(1)
{
while(P(my_sem),p->m_flag==0)
{
V(my_sem);
sleep(1);
}
printf("%d:%s\n",getpid(),p->m_buf);
if(strcmp(p->m_buf,"over")==0)
{
V(my_sem);
break;
}
p->m_flag=0;
V(my_sem);
}
shmdt(p);
}
功能函数:
/*************************************************************************
>FileName:./func.c
>Author:Comst
>Mail:750145240@qq.com
>CreatedTime:Wed04Feb201503:17:06PMCST
************************************************************************/
#include"client.h"
voidP(intsemid)
{
structsembufmy_buf;
memset(&my_buf,0,sizeof(my_buf));
my_buf.sem_num=0;
my_buf.sem_op=-1;
my_buf.sem_flg=SEM_UNDO;
semop(semid,&my_buf,1);
}
voidV(intsemid)
{
structsembufmy_buf;
memset(&my_buf,0,sizeof(my_buf));
my_buf.sem_num=0;
my_buf.sem_op=1;
my_buf.sem_flg=SEM_UNDO;
semop(semid,&my_buf,1);
}
服务器:
/*************************************************************************
>FileName:server.c
>Author:Comst
>Mail:750145240@qq.com
>CreatedTime:Wed04Feb201504:40:58PMCST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<signal.h>
#definePATH"/home/comst/pipe"
#defineNAME"server.fifo"
voidchild_handle(intsig_num)
{
printf("achildexit!\n");
wait(NULL);
}
voidreverse(char*str)
{
intbg,end;
chartmp;
bg=0;
end=strlen(str)-1;
while(bg<end)
{
tmp=str[bg];
str[bg]=str[end];
str[end]=tmp;
bg++;
end–;
}
}
voidchild_main(intfd_rd,intfd_wr)
{
charbuf[1024];
while(memset(buf,0,1024),read(fd_rd,buf,1024)!=0)
{
reverse(buf);
write(fd_wr,buf,strlen(buf));
}
}
intmain(intargc,char*argv[])
{
signal(17,child_handle);
charfile_name[128]="";
charclient_r[128],client_w[128];
charline[32];
intfd_read;
intclient_id;
intfd_cr,fd_cw;
FILE*fp;
sprintf(file_name,"%s/%s",PATH,NAME);
mkfifo(file_name,0666);
fd_read=open(file_name,O_RDONLY);
open(file_name,O_WRONLY);
fp=fdopen(fd_read,"r");
while(memset(line,0,32),fgets(line,32,fp)!=NULL)//"pid\n"
{//crcwpid_r.fifopid_w.fifo
sscanf(line,"%d",&client_id);
printf("client:%drequest!\n",client_id);
memset(client_r,0,128);
memset(client_w,0,128);
sprintf(client_r,"%s/%d_r.fifo",PATH,client_id);
sprintf(client_w,"%s/%d_w.fifo",PATH,client_id);
fd_cw=open(client_r,O_WRONLY);
fd_cr=open(client_w,O_RDONLY);
if(fork()==0)
{
child_main(fd_cr,fd_cw);
close(fd_cr);
close(fd_cw);
exit(1);
}
close(fd_cr);
close(fd_cw);
}
memset(file_name,0,128);
sprintf(file_name,"%s/%s",PATH,NAME);
unlink(file_name);
return0;
}
不给自己一点轻松的机会,好象世界的每个角落都需要自己的脚去留个痕迹,才叫人生。