[Linux管道和IPC]管道的实际应用1
/*主进程创建2个子进程,子进程1每隔1秒向子进程2发送一个字符串,子进程接收到该字符串之后将其写入一个指定的文件*/#include<stdlib.h>#include<unistd.h>#include<stdio.h>#include<signal.h>#include<time.h>#include<fcntl.h>#include<string.h>#include<sys/types.h>//以下为主函数intmain(intargc,char*argv[]){pid_tpid1,pid2;//进程的IDintfd;//文件描述符charwritebuf[]="thisisatest!\n";//待写入字符串charreadbuf[25];//读缓冲区intwritecounter=0;//用于记录写入的偏移量inttemp=0,seektemp=0,j=0;//都是用于计算文件偏移的临时变量intpipefd[2];//管道的文件描述符if(argc!=2)//如果参数不正确{printf("请输入正确的文件参数。\n");return0;}fd=open(*(argv+1),O_RDWR|O_CREAT,S_IRWXU);//打开或者创建一个文件if(pipe(pipefd)<0)//如果创建管道失败{printf("创建管道失败。\n");exit(0);//退出}pid1=fork();//调用fork创建一个新的进程if(pid1!=0)//主进程{pid2=fork();//创建第二个子进程if(pid2!=0)//主进程{close(pipefd[0]);//关闭管道close(pipefd[1]);}else//这是子进程2的操作{close(pipefd[1]);while(1){read(pipefd[0],readbuf,sizeof(writebuf));//读管道printf("这是子进程2.\n");//屏幕输出提示if(writecounter==0)//第一次写入{temp=write(fd,readbuf,strlen(readbuf));//写入数据seektemp=lseek(fd,0,SEEK_CUR);//获得当前偏移量writecounter++;}else{j=strlen(readbuf)*writecounter;seektemp=lseek(fd,j,SEEK_SET);temp=write(fd,readbuf,strlen(writebuf));writecounter++;}}}}else//子进程{close(pipefd[0]);while(1){sleep(1);write(pipefd[1],writebuf,sizeof(writebuf));//将字符串写入管道}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。