我现在无法提供代码,因为我目前正在研究这个想法,并在互联网上乱搞。
我已经了解了进程间通信并使用共享内存在进程之间共享数据(特定结构)。
但是,对于在另一个.c文件中保存的程序上使用fork()和execv(...)后如何与进程共享数据,我感到很困惑。
如果我们将信号量键作为参数提供给另一个程序(它成为子进程),我们是否能够使用semget访问共享内存?
答案 0 :(得分:0)
首先要做的事情。
根据实现情况,您的案例中的单个或多个源文件.c
可构成单个可执行文件。单个可执行文件运行进程。如果源代码中已完成fork()
,则会创建子进程。那么,你的
...不同.c文件之间的进程间通信
不一定是两个.c
个文件,无论它们是编译为单个项目还是两个不同的项目。
为了简单起见,你有两个不同的源文件,其中一个应该创建一个共享内存。
#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;};
您现在拥有一个共享内存空间,它属于两个进程(假设您已创建并将空间映射到两个进程)。您必须决定如何控制对此空间的访问。一种简单的方法是添加一个控制系统(互斥锁,信号量等),它只允许一个进程在任何时候读/写空间。控件将基本上由您编写。在读/写之前,您必须检查是否已获得锁定。
有许多方法可以实现这种控制机制。