关于进程间通信的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; }
以上就是本文的全部内容,希望对大家的学习有所帮助。