linux下C言語プログラミング7-信号量と共有メモリ
共有メモリを使用する場合は、コンカレントという問題に直面する必要があります.信号量は共有資源の申請と解放を制御することができ,ロックの目的を果たし,同時発生による様々な問題を効果的に解決した.
共有メモリの使用は「linux下C言語プログラミング4-共有メモリを使用してプロセス間通信を実現する2」を参照してください.
信号量の関数は「linux下C言語プログラミング6-信号量関数semget()semop()semctl()」を参照してください.
次に例を示します.
サービス:
クライアント:
共有メモリの使用は「linux下C言語プログラミング4-共有メモリを使用してプロセス間通信を実現する2」を参照してください.
信号量の関数は「linux下C言語プログラミング6-信号量関数semget()semop()semctl()」を参照してください.
次に例を示します.
サービス:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#define SEGSIZE 1024
//
int sem_create(key_t key)
{
int semid;
semid = semget(key, 250, IPC_CREAT|0666);
if (semid == -1)
{
printf("create semaphore error/n");
exit(0);
}
semctl(semid,0,SETVAL);
return semid;
}
//
void del_sem(int semid)
{
semctl(semid,0,IPC_RMID);
}
//p
int p(int semid) {
/*
sembuf 2 sem_op:
, 。 ;
sem_op , , , sem_op 。 ;
sem_op 0, , 0。
*/
struct sembuf sops = {1,-1,SEM_UNDO}; // sops 1
return semop(semid,&sops,1);
}
//v
int v(int semid) {
struct sembuf sops = {1,+1,SEM_UNDO};
return semop(semid,&sops,1);
}
int main()
{
key_t key;
int shmid,semid;
char *shm;
char msg[32] = "xiaoshe-";
char i;
struct semid_ds buf;
key = ftok("/",0);
shmid = shmget(key,SEGSIZE,IPC_CREAT|0604);
if (-1 == shmid){
printf(" create shared memory error/n");
return -1;
}
printf("shmid = %d/n", shmid);
shm = (char *)shmat(shmid, 0, 0);
if (-1 == (int)shm){
printf(" attach shared memory error/n");
return -1;
}
semid = sem_create(key);
printf("semid = %d/n", semid);
for (i=0; i<3; i++)
{
sleep(2);
p(semid);
printf("[%d] p ", i);fflush(stdout);
sleep(1);
//
msg[8] = '0' + i;
memcpy(shm, msg, 32);
printf("-> wirte ");fflush(stdout);
sleep(3);
v(semid);
printf("-> v/n");
}
shmdt(shm);
shmctl(shmid,IPC_RMID,&buf);
del_sem(semid);
return 0;
//gcc -o s s.c -g
}
クライアント:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <time.h>
#include <sys/ipc.h>
#define SEGSIZE 1024
//
int get_sem(key_t key)
{
int semid;
semid = semget(key,20,0);
if (-1 == semid){
printf("create semaphore error/n");
exit(1);
}
return semid;
}
// 0
void wait_v(int semid)
{
struct sembuf sops={1,0,0};
semop(semid,&sops,1);
}
int main(void)
{
key_t key;
int shmid, semid;
char *shm;
char msg[100];
char i;
key = ftok("/",0);
shmid = shmget(key,SEGSIZE,0);
if(-1 == shmid)
{
printf(" create shared memory error/n");
return -1;
}
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory error/n");
return -1;
}
semid = get_sem(key);
printf("semid = %d/n", semid);
for (i=0; i<4; i++)
{
sleep(1);
wait_v(semid);
printf("[%d] msg = '%s'/n", i, shm);
}
shmdt(shm);
return 0;
// gcc -o c c.c
}