设为首页 加入收藏

TOP

C指针原理(91)-LINUX应用(3)-进程写文件,另一进程读输入(二)
2014-11-23 19:01:30 来源: 作者: 【 】 浏览:31
Tags:指针 原理 -LINUX 应用 进程 文件 输入
参数为:标志,大小,权限
if (shm_id==-1){
printf("create shm error!\n");
exit(1);
}
//attach共享内存。连接共享内存 myhaspl
shm_addr=(char *)shmat(shm_id,NULL,0);//返回共享内存地址 myhaspl
if (!shm_addr){
printf("shmat error!\n");
exit(1);
}
//初始化数据
memset(shm_addr,'\0',MAXS);
cur=shm_addr;//当前字符起始地址
//创建进程
pid=fork();
if (pid==-1){
printf("fork error!\n");
exit(1);
}
else if(pid==0){//子进程,接受键盘输入,往共享内存中写字符行 myhaspl
int isend=0;//是否结束输入
printf("\ndeepfuture.javeye.com#line %d$",line); //自定义键盘输入时使用的SHELL外观
while((!isend)&&fgets(buf,BUFFERSIZE,stdin)!=NULL){//从shell中读入一行
line++;
printf("\ndeepfuture.javeye.com#line %d$",line); //自定义键盘输入时使用的SHELL外观

if (buf[0]=='Q'&&strlen(buf)<=2){//单个字符Q表示退出输入
isend++;//退出输入
printf("\n退出....\n");
}
else
{//如果不是退出命令
//写共享内存 myhaspl
memcpy(cur,buf,strlen(buf));
cur+=strlen(buf);
}
//写入一行,增加信号
sem_op.sem_num=0;
sem_op.sem_op=1;
sem_op.sem_flg=0;
semop(sem_id,&sem_op,1);//操作信号量,每次+1
}
*cur=-1;
exit(0);
}
else{//父进程,从共享内存中读字符行 ,并写入文件 myhaspl

while(1)
{
//读出一行,减少信号 myhaspl
sem_op.sem_num=0;
sem_op.sem_op=-1;
sem_op.sem_flg=0;
semop(sem_id,&sem_op,1);//操作信号量,每次-1

//myhaspl 读共享内存中一行
if ((*cur)==-1) break;//输入结束
int i;
for (i=0;*cur!='\n';cur++,i++){
buf[i]=*cur;
}
cur++;
buf[i]='\n';
buf[++i]=0;

//写文件
FILE *fp=fopen(FILENAME,"ab");
res=fwrite(buf,strlen(buf),1,fp);//myhaspl 写入一个行,长度为strlen(buf),个数为1
//size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
//size为要写入的每个数据的大小(多少字节),nmemb为要写入数据的个数。myhaspl
if (res==-1){
perror("write error on pipe\n");
exit(1);
}
fclose(fp);

}



wait(&pid);//等待子进程结束,即用户输入完毕
//分离共享进程
if (shmdt(shm_addr)==-1){
printf("shmdt error!\n");
}
//撤销共享内存,任何进程只要有权限,都可以撤销共享内存,不一定非要创建它的进程
struct shmid_ds shm_desc;
if (shmctl(shm_id,IPC_RMID,&shm_desc)==-1){
printf("shmctl error!\n");
}
exit(0);
}
}

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中级 下一篇建造者模式(Builder)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: