2015-05-29 58 views
1

因为我目前正在研究这个想法并在互联网上乱搞,所以我现在无法提供代码。不同的.c文件之间的IPC进程间通信

我已经了解了进程间通信并使用共享内存在进程间共享数据(特别是结构)。

但是,我对使用fork()和execv(...)在不同的.c文件中保存的程序后如何与进程共享数据感到困惑。

如果我们将信号量密钥作为参数传递给另一个程序(它变成一个子进程),我们是否可以通过semget访问共享内存?

+1

您是否知道,一旦编译了程序,不同的'.c'文件或单个大'.c'文件几乎没有区别? – Eregrith

回答

0

首先要做的事情。

  1. 取决于执行,单个或多个源文件(S),.c你的情况可以构成一个单一的可执行文件。单个可执行文件运行一个进程。如果源代码中有fork(),则创建子进程。所以,你的

    ...不同的.c文件

    之间的进程间通信不一定需要2个.c文件,不论他们是否被编译为一个单一的项目或两个不同的项目。

  2. 为了简单说一下,你有两个不同的源文件,其中一个应该创建一个共享内存。

    #define SHMSPACE 35 
    char *shm, *str; 
    key_t key = 1234; 
    
    //Create a memory segment to be shared 
    if ((shmid = shmget(key, SHMSPACE, IPC_CREAT | 0666)) < 0) 
    { 
        perror("shmget failed"); 
        exit(1); 
    } 
    
    //Attach the segment to memory space. 
    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) 
    { 
        perror("shmat failed"); 
        exit(1); 
    } 
    
    //Write something like A to Z in the shared memory for other process to read 
    str = shm; 
    for (c = 'A'; c <= 'Z'; c++) //c is declared as an int somewhere above. 
        *str++ = c; 
    *str = NULL; 
    

    你其它来源应该是:

    #define SHMSPACE 35 
    char *shm, *str; 
    key_t key = 1234; 
    
    //Get the shared memory segment 
    if ((shmid = shmget(key, SHMSPACE, 0666)) < 0) 
    { 
        perror("shmget failed"); 
        exit(1); 
    } 
    
    //Attach the segment to our data space. 
    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) 
    { 
        perror("shmat"); 
        exit(1); 
    } 
    
    //Read what other process has put in the memory. 
    for (str = shm; *str != NULL; s++) 
        putchar(*str); 
    
0

在假设说“两种不同的C文件”你的意思是“两个不同的过程(即两个C与主文件()在他们中)”。

要解决此问题,您可以使用共享内存空间。您可以使用shm_open使用名称创建一个内存空间。该名称是此空间的唯一标识符。您也可以将O_CREAT|O_EXCL作为参数传递给shm_open函数。这允许您定义空间将被创建,并且它是独占的(即空间不存在)。 shm_open函数的返回是一个文件描述符。

因此,第一个线程可以将其映射为Exclusive,第二个线程可以删除O_EXCL参数以将其映射为现有映射。因此你现在有一个进程可以使用的内存空间。

要使用它,必须将空间映射到两个进程的内存空间。假设你有一个你想用来在进程间传递数据的结构。

从截断由文件描述符指定的文件大小开始。因此,您使用ftruncate(shm_file_descriptor, sizeof(struct shm_structure)) 一旦它的大小适当,您可以使用mmap将其映射到适当的大小。

shmp = mmap(arg1,arg2,arg3) 

您现在可以像访问shmp->first_field那样访问共享内存空间。

其中:

struct shm_struct { uint8_t first_field;}; 

您现在有一个共享的内存空间,这属于两个过程(假设你已经创建并映射的空间,这两个过程)。你必须决定如何控制对这个空间的访问。一个简单的方法是添加一个控制系统(互斥体,信号量等),它只允许一个进程在任何时候读写该空间。控制将由您本质上写。在读/写之前,您必须检查您是否获得了锁。

有许多方法可以实现这种控制机制。