`
deepfuture
  • 浏览: 4398068 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80056
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:69999
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103295
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285635
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15001
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67498
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32099
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45965
社区版块
存档分类
最新评论

linux-C-共享内存+信号量-一进程写文件,另一进程读输入

阅读更多

deepfuture@deepfuture-laptop:~/private/mytest$ gcc -std=gnu99 -o testshm testshm.c

testshm.c: In function ‘main’:

testshm.c:38: warning: implicit declaration of function ‘semget’

testshm.c:41: warning: implicit declaration of function ‘exit’

testshm.c:41: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:45: warning: implicit declaration of function ‘semctl’

testshm.c:48: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:51: warning: implicit declaration of function ‘shmget’

testshm.c:54: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:57: warning: implicit declaration of function ‘shmat’

testshm.c:60: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:63: warning: implicit declaration of function ‘memset’

testshm.c:63: warning: incompatible implicit declaration of built-in function ‘memset’

testshm.c:69: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:78: warning: implicit declaration of function ‘strlen’

testshm.c:78: warning: incompatible implicit declaration of built-in function ‘strlen’

testshm.c:85: warning: implicit declaration of function ‘memcpy’

testshm.c:85: warning: incompatible implicit declaration of built-in function ‘memcpy’

testshm.c:92: warning: implicit declaration of function ‘semop’

testshm.c:95: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:119: warning: incompatible implicit declaration of built-in function ‘strlen’

testshm.c:124: warning: incompatible implicit declaration of built-in function ‘exit’

testshm.c:132: warning: implicit declaration of function ‘wait’

testshm.c:134: warning: implicit declaration of function ‘shmdt’

testshm.c:139: warning: implicit declaration of function ‘shmctl’

testshm.c:142: warning: incompatible implicit declaration of built-in function ‘exit’

deepfuture@deepfuture-laptop:~/private/mytest$ ./testshm

 

deepfuture.javeye.com#line 1$deepfuture

 

deepfuture.javeye.com#line 2$javaeye

 

deepfuture.javeye.com#line 3$com

 

deepfuture.javeye.com#line 4$deepfuture.iteye.com

 

deepfuture.javeye.com#line 5$Q

 

deepfuture.javeye.com#line 6$

退出....

deepfuture@deepfuture-laptop:~/private/mytest$ cat abc.txt

deepfuture

javaeye

com

deepfuture.iteye.com

deepfuture@deepfuture-laptop:~/private/mytest$ 

#include <stdio.h>
#include <unistd.h>
#include <linux/types.h>
#include <linux/shm.h>
#include <linux/sem.h>
#include <linux/ipc.h>




#define MAXS  (1024+1)
#define BUFFERSIZE  200
#define SEMID 251//信号标志
#define FILENAME "abc.txt"
#define SHMKEY 241//共享内存标志
#define SHMSIZE MAXS//共享内存大小


//程序完成父进程接收键盘输入,子进程存入文件FILENAME。
//deepfuture.iteye.com

int main(void){
    char strbuf[MAXS];
    char buf[BUFFERSIZE];
    int sem_id;
    int shm_id;
    int pid;
    int rc,res;
    struct sembuf sem_op;//信号集结构
    union semun sem_val;//信号量数值
    char *cur;
    FILE *myfile;
    char *shm_addr;
    int line=1;

    
    //建立信号量集,其中只有一个信号量 deepfuture.iteye.com 
    sem_id=semget(SEMID,1,IPC_CREAT|0600);//SEMID为为正整数,则为公共的;1为信号集的数量;
    if (sem_id==-1){
        printf("create sem error!\n");
        exit(1);    
    }
    //信号量初始化
    sem_val.val=0;
    rc=semctl(sem_id,0,SETVAL,sem_val);//设置信号量
    if (rc==-1){
        printf("initlize sem error!\n");
        exit(1);    
    }
    //建立共享内存
    shm_id=shmget(SHMKEY,SHMSIZE,IPC_CREAT|0600);//参数为:标志,大小,权限
    if (shm_id==-1){
        printf("create shm error!\n");
        exit(1);    
    }     
    //attach共享内存。连接共享内存 deepfuture.iteye.com 
    shm_addr=(char *)shmat(shm_id,NULL,0);//返回共享内存地址 deepfuture.iteye.com 
    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){//子进程,接受键盘输入,往共享内存中写字符行 deepfuture.iteye.com 
         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
             {//如果不是退出命令             	  	   
    	  	   //写共享内存 deepfuture.iteye.com 	      	  	   
        	   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{//父进程,从共享内存中读字符行 ,并写入文件    deepfuture.iteye.com 	    
       	  
          while(1)
          {
            //读出一行,减少信号  deepfuture.iteye.com 
              sem_op.sem_num=0;
              sem_op.sem_op=-1;
              sem_op.sem_flg=0;
              semop(sem_id,&sem_op,1);//操作信号量,每次-1   
            
        	  //deepfuture.iteye.com  读共享内存中一行
        	 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);//deepfuture.iteye.com  写入一个行,长度为strlen(buf),个数为1     	  
        	  //size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
        	  //size为要写入的每个数据的大小(多少字节),nmemb为要写入数据的个数。deepfuture.iteye.com 
              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); 
 	  	 }
}

 
0
0
分享到:
评论

相关推荐

    使用共享内存及信号量实现进程间通信例子

    本示例代码着重于使用共享内存和信号量来解决进程间的通信和同步问题,这是一种高效且灵活的方法,特别是在多处理器和多线程环境中。下面我们将详细探讨这些概念以及它们在Linux系统中的实现。 **共享内存** 是一种...

    Linux 下C++共享内存、信号量封装,实现进程同步

    Linux 下C++共享内存、信号量封装,实现进程同步

    linux下共享内存+信号量

    linux下共享内存+信号量,不会出奇怪的错误,如信号量和共享内存未清,导致无法再次运行,ctrl+c后能够正常清除信号量及共享内存。

    Linux多进程通信-信号量,共享内存示例

    例如,当一个进程写入共享内存后,会用信号量通知其他进程数据已准备好,避免了数据竞争。反之,当进程需要访问共享内存时,会先检查信号量,确保没有其他进程正在使用资源。 下面是一个简化的示例流程: 1. 初始...

    【LINUX实时聊天室--原创可修改 95+】linux实时聊天系统(原创)进程间通信

    常见的IPC机制包括管道(pipe)、消息队列、共享内存、信号量、套接字等。在这个项目中,作者可能使用了其中的一种或多种来确保数据的高效传输和同步。 2. **网络编程**:聊天系统通常基于TCP/IP协议栈工作,因此...

    Linux课件之7信号量、共享内存和消息队列.ppt

    Linux中的System V Interprocess Communication (IPC) 是一种进程间通信机制,它提供了三种主要的工具:信号量、共享内存和消息队列。这些机制允许不同的进程之间有效地协调和交换信息,是多线程和多进程应用程序中...

    共享内存+互斥量实现linux进程间通信.pdf

    共享内存并未提供进程同步机制,使用共享内存完成进程间通信时,需要借助互斥量或者信号量来完成进程的同步。 二、使用系统调用完成共享内存的申请、连接、分离和删除 共享内存函数由 shmget、shmat、shmdt、...

    信号量实现共享内存读写同步

    C语言编写程序,用信号量和共享内存实现读写同步,程序中父进程为读进程,子进程为写进程。开启共享内存空间和二值信号量,子进程占用信号量,父进程无法执行读,等待子进程写完释放信号量后父进程进行读操作。依次...

    linux无亲缘关系进程间通信(互斥锁+条件变量+共享内存)

    在给定的`server.c`和`client.c`代码中,服务器进程可能会创建一块共享内存,设置互斥锁和条件变量,然后在其中存储数据。客户端进程则通过连接共享内存,使用互斥锁保护数据,当数据满足预设条件时,服务器进程会...

    C 共享内存读写 2个程序之间传输数据

    在IT领域,尤其是在多进程编程中,C语言的共享内存是一种高效的数据通信方式,它允许两个或多个进程之间共享同一块内存空间,从而实现数据的快速传输。在Linux操作系统环境下,这种技术通常依赖于POSIX标准提供的...

    linux无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)

    共享内存是一种高效的进程间通信方式,它允许多个进程直接访问同一块内存区域。通过`shmget`创建共享内存,`shmat`将其映射到进程地址空间,`shmdt`则用于取消映射。为了防止多个进程同时访问同一数据,通常会结合...

    Linux进程间通信-信号量通信进程互斥实例.pdf

    Linux提供了多种IPC方式,包括管道、消息队列、共享内存、信号量等。本实例主要关注的是【信号量通信】,这是一种用于控制多个进程对共享资源访问的同步机制。 【信号量】信号量是一种特殊的变量,它可以在进程之间...

    linux c 进程间通信(共享内存+消息队列)

    在实际编程中,为了保证进程间的同步和数据一致性,常常需要结合使用信号量(semaphores)来控制对共享内存的访问,或者在消息队列中设置适当的等待策略。 **实例应用**:一个典型的场景可能是多个进程通过共享内存...

    Linux进程间通信之共享内存

    Linux进程间通信的共享内存是一种高效的数据交换方式,但是对共享内存的访问同步控制需要程序员自己实现,这是在使用共享内存时需要注意的问题。通过上述步骤和示例程序的学习,我们可以更好地理解共享内存的工作...

    Linux进程间通信(消息队列、信号量+共享内存).zip

    在这个“Linux进程间通信(消息队列、信号量+共享内存).zip”压缩包中,我们可以看到涉及到Linux IPC的三种主要方法:消息队列、信号量以及共享内存。这些技术在实现分布式锁和信号量控制等方面有着广泛的应用。 1...

    ipc.rar_共享内存 封装_进程信号量

    在“hipc.c”和“hipc.h”文件中,可能已经实现了共享内存和信号量的封装,例如定义了结构体和函数,使得用户能够简单地创建、连接到共享内存,并使用信号量进行同步。通过这样的封装,开发者可以更专注于应用逻辑,...

    进程间通讯---共享内存的使用方法

    为了同步多个进程对共享内存的访问,还可以结合信号量或者互斥锁等同步机制。 总结起来,共享内存是一种强大的进程间通信机制,适用于需要高速数据交换的场景。在C语言中,利用POSIX API可以方便地创建、映射和管理...

    进程通讯-共享内存及信号量

    进程通讯-共享内存及信号量,最简单的共享内存通讯的两个文件input.cpp及output.cpp;加入信号量的文件inputsemaphore.cpp及呕吐putsemaphore.cpp;以及linux下cpp与QT通讯。

    linux 共享内存详解

    ### Linux共享内存详解 #### 一、概述 在Linux及Unix环境下,进程间通信(IPC, Inter-Process Communication)是一项重要的技术,它允许不同进程之间交换数据和信息。System V IPC提供了三种通信机制:消息队列、...

Global site tag (gtag.js) - Google Analytics