IPC不同.c文件之间的进程间通信

时间:2015-05-29 07:47:34

标签: c ipc semaphore

我现在无法提供代码,因为我目前正在研究这个想法,并在互联网上乱搞。

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

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

如果我们将信号量键作为参数提供给另一个程序(它成为子进程),我们是否能够使用semget访问共享内存?

2 个答案:

答案 0 :(得分:0)

首先要做的事情。

  1. 根据实现情况,您的案例中的单个或多个源文件.c可构成单个可执行文件。单个可执行文件运行进程。如果源代码中已完成fork(),则会创建子进程。那么,你的

      

    ...不同.c文件之间的进程间通信

    不一定是两个.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);
    

答案 1 :(得分:0)

假设通过说&#34;两个不同的C文件&#34;你的意思是&#34;两个不同的进程(即两个带有main()的C文件)&#34;。

要解决此问题,您可以使用共享内存空间。您可以使用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;};

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

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