void ipc_systemv_sem()
{
int semid;
key_t key;
const unsigned int perms = S_IRUSR | S_IWUSR | S_IWGRP; // 읽기/쓰기 권한이 있어야 함.
struct semid_ds ds;
key = ftok(KEY_PATH, 1);
// 세마포어의 갯수가 1개인(0번) 세마포어 집합을 생성한다.
semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms);
/*
세마포어에 접근하는 프로세스 중 세마포어를 생성하는 프로세스는 1개이다.
나머지 프로세스는 여기서 EEXIST 에러를 리턴받고 else로 가서 이미 생성된 세마포어에 접근하게 됨.
*/
if(semid != -1) {
union semun arg;
struct sembuf sop;
// 0번 세마포어 값을 0으로 설정
arg.val = 0;
if(semctl(semid, 0, SETVAL, arg) == -1)
errExit("semctl()");
/*
sem_op = 0의 값으로 semop을 호출하는 것은 세마포어 값이 0이 될때까지 블록한다는 의미이다.
그런데 이미 세마포어의 값이 0으로 초기화되기 때문에 no-op에 해당한다.
하지만 semop 호출은 sem_optime(접근 시간)을 변경해서
뒤이어 실행되는 다른 프로세스가 세마포어가 초기화되었음을 알 수 있게 한다.
*/
sop.sem_num = 0; // 세마포어 번호 0에 대해서,
sop.sem_op = 0; // 세마포어 값은 이미 0이므로 아무 작업도 이루어지지 않는다.
sop.sem_flg = 0;
if(semop(semid, &sop, 1) == -1) {
errExit("semop()");
} // 이 때 sem_optime이 업데이트됨.
// 0번 세마포어 값을 2로 설정.
// 따라서 세마포어 값이 1, 2일 때 프로세스들은 '작업'으로 진입할 수 있다.
arg.val = 2;
if(semctl(semid, 0, SETVAL, arg) == -1)
errExit("semctl()");
}
// key에 해당하는 세마포어 식별자가 이미 생성되어 있는 경우,
else {
const int MAX_TRIES = 10;
int j;
union semun arg;
// 이미 열려진 세마포어 식별자를 얻어옴.
if((semid = semget(key, 1, perms)) == -1)
errExit("semget()");
arg.buf = &ds;
// 세마포어를 생성하는 프로세스가 semop를 호출할 때까지 대기
for (j = 0; j < MAX_TRIES; ++j) {
if(semctl(semid, 0, IPC_STAT, arg) == -1)
errExit("semctl()");
// 세마포어 생성이 완료되었다면, 루프 종료
if(ds.sem_otime != 0)
break;
sleep(1);
}
}
if(ds.sem_otime == 0)
fatal("Semaphore not initialized yet.");
// 0번 세마포어 값 조회
int semval = semctl(semid, 0, GETVAL, 0);
printf("val = %d\n", semval);
// 세마포어 값을 -1한다. -1이 가능할 때까지 대기함.
struct sembuf sop;
sop.sem_num = 0;
sop.sem_op = -1;
sop.sem_flg = 0;
if(semop(semid, &sop, 1) == -1) {
errExit("semop()");
}
/*
여기서 만일 semop에 의해 블록되고 있는 상태에서 SIGINT등을 받아서 블록이 중단되면,
세마포어를 해제하는 작업이 수행되지 않기 때문에, 다른 프로세스들이 영원히 진입할 수 없는 문제가 생김.
*/
// 세마포어로 보호해야 하는 '작업'을 수행
printf("job start..\n");
sleep(5);
printf("job end..\n");
// 세마포어 값을 +1한다. 세마포어에 대기하고 있는 다른 프로세스들이 '작업'으로 진입한다.
sop.sem_num = 0;
sop.sem_op = 1;
sop.sem_flg = 0;
if(semop(semid, &sop, 1) == -1) {
errExit("semop()");
}
}
int main()
{
int running = 1;
void *shared_memory = (void *)0;
struct shared_use_st *shared_stuff;
int shmid;
srand((unsigned int)getpid());
//get the semaphores
sem_id = semget((key_t)1233, 1, 0666 | IPC_CREAT);
sem_id2 = semget((key_t)1235, 1, 0666 | IPC_CREAT);
sem_id3 = semget((key_t)1236, 1, 0666 | IPC_CREAT);
/*
*sets the semaphores to the required values if it fails program ends
*/
if (!set_mutex()| !set_available()| !set_empty()) {
fprintf(stderr, "Failed to initialize semaphore\n");
exit(EXIT_FAILURE);
}
//get shared memory
shmid = shmget((key_t)1231, (sizeof(struct shared_use_st)- sizeof(int)) , 0666 | IPC_CREAT);
if (shmid == -1) {
fprintf(stderr, "shmget failed prod\n");
exit(EXIT_FAILURE);
}
/* We now make the shared memory accessible to the program. */
shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X\n", (void *)shared_memory);
/* The next portion of the program assigns the shared_memory segment to shared_stuff,
Reads in from the input file test4k.txt into the buffer ibuffer string of size BUFSIZ, then the
loop continually copies text from ibuffer into the buffers in shared memory which take 128 bytes of char until a value less than 128 is written which means approached end of text then it sleeps and deletes the semaphores */
shared_stuff = (struct shared_use_st *)shared_memory;
//shared_stuff->written_by_you = 0;
char ibuffer[BUFSIZ]; // input buffer
int in; // variable to hold reference to input file
int index=0; // current index of element in array of structs in shared memory
int len; // length read
int tot = 0; // Total length read
in = open("test4k.txt",O_RDONLY);
len = read(in,ibuffer, sizeof(ibuffer));
while(running){
for(int i = 0; i<= len; i+=128){
sleep(2);
if((len-i)<128){
//if value written is less than 128 delete semaphores
shared_stuff->msgs[index].written = len-i;
memcpy(shared_stuff->msgs[index].some_text, ibuffer + (len-i), (len-i));
tot+= shared_stuff->msgs[index].written;
printf("Producer: bytes written val %d\n", shared_stuff->msgs[index].written);
printf("Producer: Total bytes written val %d\n", tot);
sleep(10);
del_semvalue();
exit(EXIT_SUCCESS);
}
else{
empty_p();
mutex_p();
shared_stuff->msgs[index].written = 128;
printf("Producer: bytes written val %d\n", shared_stuff->msgs[index].written);
memcpy(shared_stuff->msgs[index].some_text,ibuffer + i,128);
tot+= shared_stuff->msgs[index].written;
index = (index+1)%k;
mutex_v();
available_v();
}
}
}
//.........这里部分代码省略.........
开发者ID:obi-el,项目名称:C-Code,代码行数:101,代码来源:producer.c
示例14: main
main()
{
semid=semget(IPC_PRIVATE, 3, 0666);
seminfo.val=1;
semctl(semid,C_C, SETVAL,seminfo);
seminfo.val=0;
semctl(semid,C_D, SETVAL,seminfo);
shmid=shmget(IPC_PRIVATE, 2, 0666);//for storing command and port
shmid_s =shmget(IPC_PRIVATE, 100, 0666);//for storing file name
shmptr=(int *)shmat(shmid, 0, 0);
shmptr_s=(char *)shmat(shmid_s, 0, 0);
*(shmptr)=0;
*(shmptr+1)=0;
int cc = getpid();
int cd = fork();
int d= 4;
int32_t conv;
int code;
//Control Process of Client
if(getpid() == cc)
{
//printf("In CC...");
int tcpC1 ;
struct sockaddr_in serv_addr;
int i;
char buf[100];
//Socket Creation
if ((tcpC1 = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("Unable to create socket\n");
exit(0);
}
//Initialing the socket variables
serv_addr.sin_family= AF_INET;
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
serv_addr.sin_port=htons(50000);
//Connecting to server
if ((connect(tcpC1, (struct sockaddr *) &serv_addr,sizeof(serv_addr))) < 0)
{
printf("Unable to connect to server\n");
exit(0);
}
for(i=0;i<100;i++)
buf[i]='\0';
while(1)
{
semop(semid,&WaitC,1);
printf(">");
fgets(buf,100,stdin);
write(tcpC1, buf, strlen(buf) + 1);//sending command to server
int k =0,index =0;
char a[100],b[100];
while(1)
{
if(buf[k]==' ' || buf[k]=='\0')
break;
else
{
a[index]=buf[k];
index++;
}
k++;
}
a[index]='\0';//command saved
k++;
index=0;
while(1)
{
if((strcmp(a,"quit")==0) || buf[k]=='\0')
break;
else
{
b[index]=buf[k];
index++;
}
k++;
}
b[index]='\0';//argument saved
int flag = 0;
//.........这里部分代码省略.........
开发者ID:singharpit94,项目名称:SAS,代码行数:101,代码来源:ftpC.c
示例15: shmget
int Linda::init(key_t shm_key)
{
// try to create new shared memory segment
shmId = shmget(shm_key, 4 + MAX_TUPLES*(TUPLE_MAX_SIZE + 1), IPC_CREAT | IPC_EXCL | 0777);
// try to create new shared memory segment
shmId = shmget(shm_key, 4 + MAX_TUPLES*(TUPLE_MAX_SIZE + 1), IPC_CREAT | IPC_EXCL | 0777);
if (shmId < 0 && errno == EEXIST) // someone already created shm segment
{
// connect to existing shm segment
shmId = shmget(shm_key, 4 + MAX_TUPLES*(TUPLE_MAX_SIZE + 1), IPC_CREAT | 0777);
if(shmId == -1)
{
int err = errno;
if (debug) std::cerr << "[Linda] Error connecting to shared memory segment." << std::endl;
return err;
}
// read basic environment data (process counter and semaphores' table id)
if ((shm = (SharedMemory*)shmat(shmId, 0, 0)) < 0)
{
int err = errno;
if (debug) std::cerr << "[Linda] Error mapping shared memory segment." << std::endl;
return err;
}
if (debug) std::cout << "[Linda] semKey=" << shm->semKey;
if ((semId = semget(shm->semKey, 3, IPC_CREAT | 0777)) == -1)
{
int err = errno;
if (debug) std::cerr << "[Linda] Error obtaining existing semaphores." << std::endl;
return errno;
}
if (debug) std::cout << "[Linda] semId="<<semId << std::endl;
struct sembuf getCriticalSection[1] =
{
SEM_READ, 1, 0,
};
if (semop(semId, getCriticalSection, sizeof(getCriticalSection)/sizeof(sembuf)) < 0)
{
int err = errno;
if (debug)
std::cerr << "[Linda input] Error refreshing readers' semaphore limit." << std::endl;
return err;
}
return 0;
}
else if (shmId == -1)
{
int err = errno;
if (debug)
std::cerr << "[Linda] Error creating new shared memory segment." << std::endl;
return err;
}
// we created new shared memory segment, so fill it with empty environment data
if ((long)(shm = (SharedMemory*)shmat(shmId, 0, 0)) < 0)
{
int err = errno;
if (debug)
std::cerr << "[Linda] Error mapping shared memory segment." << std::endl;
return err;
}
int key = 1234;
if ((semId = semget(key, 3, IPC_CREAT | IPC_EXCL | 0777)) == -1)
{
int err = errno;
if (debug)
std::cerr << "[Linda] Error creating semaphore set." << std::endl;
return err;
}
if (debug)
std::cout << "[Linda] semId=" << semId << std::endl;
shm->semKey = key;
for (int i = 0; i < MAX_TUPLES; i++)
shm->tupleArray[i].valid = TUPLE_INVALID;
struct sembuf increment[1] =
{
SEM_READ, 1, 0,
};
if (semop(semId, increment, sizeof(increment)/sizeof(sembuf)) < 0)
{
int err = errno;
if (debug)
std::cerr << "[Linda input] Error refreshing readers' semaphore limit." << std::endl;
return err;
}
if (debug)
std::cout<<"[Linda] Incremented sem_read"<<std::endl;
return 0;
}
/**
* Remove the semaphore array for the bus
*
* @param bus Bus information
* @return 0 on success, -1 on error
*/
static int
remove_semaphores(const bus_t *bus)
{
int id = semget(bus->key_sem, BUS_SEMAPHORES, 0);
return ((id == -1) || (semctl(id, 0, IPC_RMID) == -1)) ? -1 : 0;
}
开发者ID:uselessd,项目名称:bus,代码行数:12,代码来源:bus.c
示例17: PR_IMPLEMENT
PR_IMPLEMENT(PRSem *) PR_OpenSemaphore(
const char *name,
PRIntn flags,
PRIntn mode,
PRUintn value)
{
PRSem *sem;
key_t key;
union semun arg;
struct sembuf sop;
struct semid_ds seminfo;
#define MAX_TRIES 60
PRIntn i;
char osname[PR_IPC_NAME_SIZE];
if (_PR_MakeNativeIPCName(name, osname, sizeof(osname), _PRIPCSem)
== PR_FAILURE)
{
return NULL;
}
/* Make sure the file exists before calling ftok. */
if (flags & PR_SEM_CREATE)
{
int osfd = open(osname, O_RDWR|O_CREAT, mode);
if (-1 == osfd)
{
_PR_MD_MAP_OPEN_ERROR(errno);
return NULL;
}
if (close(osfd) == -1)
{
_PR_MD_MAP_CLOSE_ERROR(errno);
return NULL;
}
}
key = ftok(osname, NSPR_IPC_KEY_ID);
if ((key_t)-1 == key)
{
_PR_MD_MAP_DEFAULT_ERROR(errno);
return NULL;
}
sem = PR_NEW(PRSem);
if (NULL == sem)
{
PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
return NULL;
}
if (flags & PR_SEM_CREATE)
{
sem->semid = semget(key, 1, mode|IPC_CREAT|IPC_EXCL);
if (sem->semid >= 0)
{
/* creator of a semaphore is responsible for initializing it */
arg.val = 0;
if (semctl(sem->semid, 0, SETVAL, arg) == -1)
{
_PR_MD_MAP_DEFAULT_ERROR(errno);
PR_DELETE(sem);
return NULL;
}
/* call semop to set sem_otime to nonzero */
sop.sem_num = 0;
sop.sem_op = value;
sop.sem_flg = 0;
if (semop(sem->semid, &sop, 1) == -1)
{
_PR_MD_MAP_DEFAULT_ERROR(errno);
PR_DELETE(sem);
return NULL;
}
return sem;
}
if (errno != EEXIST || flags & PR_SEM_EXCL)
{
_PR_MD_MAP_DEFAULT_ERROR(errno);
PR_DELETE(sem);
return NULL;
}
}
sem->semid = semget(key, 1, NSPR_SEM_MODE);
if (sem->semid == -1)
{
_PR_MD_MAP_DEFAULT_ERROR(errno);
PR_DELETE(sem);
return NULL;
}
for (i = 0; i < MAX_TRIES; i++)
{
arg.buf = &seminfo;
semctl(sem->semid, 0, IPC_STAT, arg);
if (seminfo.sem_otime != 0) break;
sleep(1);
}
if (i == MAX_TRIES)
{
//.........这里部分代码省略.........
请发表评论