weizheng1000的专栏

这两天学习的东西有点多,,感觉完全应付不过来了,一直在消化这几天学习的东西所以

主要学习了

总结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;

}

不给自己一点轻松的机会,好象世界的每个角落都需要自己的脚去留个痕迹,才叫人生。

weizheng1000的专栏

相关文章:

你感兴趣的文章:

标签云: