关于进程间通信的Linux小程序
利用工作之余为小伙伴写了份作业,关于进程间通信的。题目如下:
“父进程从键盘上接受1000个数据,对其求和sum1,子进程对这1000个数平方和sum2,结果传给父进程,父进程将sum1+sum2后,打印结果。”
要求:用大小为10的共享区传递1000个数据;子进程用消息机制将sum2传给父进程。
主要利用共享内存实现进程间通信,使用管道实现进程间竞争关系,FreeBSD下测试通过。代码如下:时间有限,有可能有些不足,希望高手给予指点。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<signal.h>
constintkey=0x12345678;
staticintpfd1[2],pfd2[2];
#defineSHM_LEN(10*1024)
#defineVAL_NUM5
intinit_shm(){
intshmid=-1;
shmid=shmget((key_t)key,SHM_LEN,0666|IPC_CREAT);
if(shmid<0){
printf("shmgetfailed!\n");
exit(-1);
}
returnshmid;
}
voidcancel_shm(intshmid){
if(shmctl(shmid,IPC_RMID,0)==-1){
printf("shmctlfailed!\n");
exit(-1);
}
printf("cancel_shmsuccessfully!\n");
}
void*shm_get(intshmid){
void*mem=NULL;
mem=shmat(shmid,0,0);
if(mem==(void*)-1){
printf("shmatfailed!\n");
exit(-1);
}
returnmem;
}
intget_val(int*val,intnum){
inti;
for(i=0;i<num;i++){
printf("pleaseinputanum:");
scanf("%d",val+i);
}
}
voidshow_val(int*val,intnum){
inti;
for(i=0;i<num;i++){
printf("%d\t",*(val+i));
}
printf("\n");
}
intadd_val(int*val,intnum){
intresult=0;
inti;
for(i=0;i<num;i++){
result+=*(val+i);
}
returnresult;
}
intsquare_val(int*val,intnum){
intresult=0;
inti,tmp;
for(i=0;i<num;i++){
tmp=*(val+i);
result+=(tmp*tmp);
}
returnresult;
}
voidTELL_WAIT(void){
if(pipe(pfd1)<0||pipe(pfd2)<0){
printf("pipeerror!\n");
exit(-1);
}
}
voidTELL_PARENT(pid_tpid){
if(write(pfd2[1],"c",1)!=1){
printf("writeerror!\n");
exit(-1);
}
}
voidWAIT_PARENT(void){
charc;
if(read(pfd1[0],&c,1)!=1){
printf("readerror!\n");
exit(-1);
}
}
voidTELL_CHILD(pid_tpid){
if(write(pfd1[1],"p",1)!=1){
printf("writeerror!\n");
exit(-1);
}
}
voidWAIT_CHILD(void){
charc;
if(read(pfd2[0],&c,1)!=1){
printf("readerror!\n");
exit(-1);
}
}
intmain(intargc,char*argv[]){
void*mem=NULL;
intshmid=-1;
pid_tpid=-1;
intval[VAL_NUM];
intresult=0;
shmid=init_shm();
TELL_WAIT();
if((pid=fork())<0){//error
printf("forkerror!\n");
exit(-1);
}elseif(pid==0){//child
intresult=0;
WAIT_PARENT();
mem=shm_get(shmid);//getsharememery
memcpy(val,mem,sizeof(int)*VAL_NUM);
result=square_val(val,VAL_NUM);
*(int*)((void*)mem+SHM_LEN-4)=result;
TELL_PARENT(pid);
exit(1);
}else{//parent
intchild_result=0;
mem=shm_get(shmid);//getsharememery
get_val(val,VAL_NUM);//getuserinput
memcpy(mem,val,sizeof(int)*VAL_NUM);//copyuserinputtosharememery
TELL_CHILD(pid);
result=add_val(val,VAL_NUM);
WAIT_CHILD();
child_result=*(int*)((void*)mem+SHM_LEN-4);
printf("result:%d,child_result:%d,all:%d\n",result,child_result,result+child_result);
}
cancel_shm(shmid);
return0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助。