我有计划A和计划B.方案A做出一个储存到共享内存shmget的,然后的shmat队列。 方法B启动,然后使用相同的的shmid以获得处理没有问题A制备所述队列。 处理A(A和B两者都在同一时间运行明显),然后运行该修改在队列某一元件的方法。 当程序的执行此操作时,指针指向的内存块给我分割故障。 可能是因为程序B现在有指针指向它,我想。 我的问题是如何解决这个问题,使程序的可编辑从队列以及方案B.阅读我知道,我需要某种形式的锁,但不知道是什么样的锁的话最好还是如何正确实施这个。 如果你可以把一些示例代码一起去你的解释,将有很大的帮助。 我的方式和过程的写入所有的这在C具有2个密钥,一个队列,另一个阵列保持从程序A在共享存储器分配每段中所有的shmids由节目B被用于检索该信息。
Answer 1:
我同意意见,可能有更好的方法来解决根本问题,例如用管道。 然而,由于我的测试代码,不正是你的描述,我将与你分享。 注意,运行此代码时,你应该总是在启动客户端之前启动服务器。
中的代码除了共享存储器中创建的一对信号量。 所述REQUEST_SEM
用于由客户端以信号通知数据是可用的服务器。 该RESPONSE_SEM
是由服务器使用,以表明它与客户端的请求进行。
如果您决定更改共享内存的大小,你需要使用ipcrm
命令删除以前分配的共享内存。 另一个有用的命令是ipcs
,其中列出了您所创建的IPC对象。
最后要注意的。 使用硬编码的key
是坏的。 请参阅文档ftok
一种更好的方法来生成key
。
Server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <errno.h>
#define REQUEST_SEM 0
#define RESPONSE_SEM 1
#define SEM_RA (SEM_R | SEM_A)
#define SEM_FLAGS (SEM_RA | (SEM_RA >> 3) | (SEM_RA >> 6))
#define MEM_RW (SHM_R | SHM_W)
#define MEM_FLAGS (MEM_RW | (MEM_RW >> 3) | (MEM_RW >> 6))
static void error( const char *msg )
{
perror( msg );
exit( 1 );
}
void waitForIt( int semid, int semnum )
{
struct sembuf operations = { semnum, -1, 0 };
if ( semop( semid, &operations, 1 ) < 0 )
error( __func__ );
}
void signalIt( int semid, int semnum )
{
struct sembuf operations = { semnum, 1, 0 };
if ( semop( semid, &operations, 1 ) < 0 )
error( __func__ );
}
int main( int argc, char *argv[] )
{
int i, semID, memID, good, bad;
char *memAddress;
if ( (semID = semget( 0x1001, 2, IPC_CREAT | SEM_FLAGS )) < 0 )
error( "Unable to create semaphores" );
if ( semctl( semID, REQUEST_SEM, SETVAL, 0 ) < 0 )
error( "Unable to initialize request semaphore" );
if ( semctl( semID, RESPONSE_SEM, SETVAL, 0 ) < 0 )
error( "Unable to initialize response semaphore" );
if ( (memID = shmget( 0x1001, 1024, IPC_CREAT | MEM_FLAGS )) < 0 )
error( "Unable to create shared memory" );
memAddress = shmat( memID, NULL, 0 );
if ( memAddress == NULL || memAddress == ((void *) -1) )
error( "Unable to attach shared memory" );
good = 0;
bad = 0;
for ( i = 0; i < 100; i++ )
{
waitForIt( semID, REQUEST_SEM );
if ( memAddress[0] == i )
good++;
else
bad++;
memAddress[0] = 0x55;
signalIt( semID, RESPONSE_SEM );
}
printf( "good=%d bad=%d\n", good, bad );
if ( shmdt( memAddress ) < 0 )
error( "Unable to detach shared memory" );
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <errno.h>
#define REQUEST_SEM 0
#define RESPONSE_SEM 1
static void error( const char *msg )
{
perror( msg );
exit( 1 );
}
void waitForIt( int semid, int semnum )
{
struct sembuf operations = { semnum, -1, 0 };
if ( semop( semid, &operations, 1 ) < 0 )
error( __func__ );
}
void signalIt( int semid, int semnum )
{
struct sembuf operations = { semnum, 1, 0 };
if ( semop( semid, &operations, 1 ) < 0 )
error( __func__ );
}
int main( void )
{
int i, semID, memID, good, bad;
char *memAddress;
if ( (semID = semget( 0x1001, 0, 0 )) < 0 )
error( "Unable to get semaphores" );
if ( (memID = shmget( 0x1001, 0, 0 )) < 0 )
error( "Unable to create shared memory" );
memAddress = shmat( memID, NULL, 0 );
if ( memAddress == NULL || memAddress == ((void *) -1) )
error( "Unable to attach shared memory" );
good = 0;
bad = 0;
for ( i = 0; i < 100; i++ )
{
memAddress[0] = i;
signalIt( semID, REQUEST_SEM );
waitForIt( semID, RESPONSE_SEM );
if ( memAddress[0] == 0x55 )
good++;
else
bad++;
}
printf( "good=%d bad=%d\n", good, bad );
if ( shmdt( memAddress ) < 0 )
error( "Unable to detach shared memory" );
}
文章来源: How to coordinate shared memory between 2 processes