semaphore 를 이용해서 프로그램 짜봤는데 이해가 안되고 오류가 많이뜨네요
프로그램 이해가 잘안됨니다 주석좀 부탁드림니다...
오류가 많이 나요 뭐 빠진게 있습니까?
====================================
서버부분
#include
#include
#include
#include
#include "shm.h"
int shmid, clisem, servsem;
mesg *mesgptr;
main()
{
if ( (shmid = shmget(SHMKEY, sizeof(Mesg), PERMS | IPC_CREAT)) < 0)
err_sys("server: can't get shared memory");
if ( (mesgptr = (Mesg *) shmat(shmid, (char *) 0, 0)) == (Mesg *) -1)
err_sys("server: can't attach shared memory");
if( (clisem = sem_create(SEMKEY1, 1)) <0)
err_sys("server: can't create client samaphore");
if( (servsem = sem_create(SEMKEY2, 0)) < 0)
err_sys("server: can't create server semaphore");
server();
if(shmdt(mesgptr) < 0)
err_sys("server: can't detach shared memory");
sem_close(clisem);
sem_close(servsem);
exit(0);
}
server()
{
int m, filefd;
char errmesg[256], *sys_err_str();
sem_wait(servsem);
mesgptr->mesg_data[mesgptr->mesg_len] = '\0';
if( (filefd = open(mesgptr->mesg_data, 0)) < 0) {
sprintf(errmesg, ": can't open, %s\n", sys_err_str());
strcat(mesgptr->mesg_data, errmesg);
mesgptr->mesg_len = strlen(mesgptr->mesg_data);
sem_signal(clisem);
sem_wait(servsem);
} else {
while ( (n = read(filefd, mesgptr->mesg_data, MAXMESGDATA-1))
mesgptr->mesg_len = n;
sem_signal(clisem);
sem_wait(servsem);
}
close(filefd);
if (n < 0)
err_sys("server: read error");
}
mesgptr->mesg_len = 0;
sem_signal(clisem);
}
=====================================================
클라이언트 부분
#include
#include
#include
#include
#include "shm.h"
int shmid, clisem, servsem;
mesg *mesgptr;
main()
{
if ( (shmid = shmget(SHMKEY, sizeof(Mesg), 0)) < 0)
err_sys("client: can't get shared memory segment");
if ( (mesgptr = (Mesg *) shmat(shmid, (char *) 0, 0)) == (Mesg *) -1)
err_sys("client: can't attach shared memory segment");
if ( (clisem = sem_open(SEMKEY1)) < 0)
err_sys("client: can't open client semaphore");
if ( (servsem = sem_open(SEMKEY2)) < 0)
err_sys("client: can't open server semaphore");
client();
if (shmot(mesgptr) < 0)
err_sys("client: can't detach shared memory");
if (shmotl(shmid, IPC_RMID, (struct shmid_ds *) 0) < 0)
err_sys("client: can't remove shared memory");
sem_close(clisem);
sem_close(servsem);
exit(0);
}
client()
{
int n;
sem_wait(clisem);
if(fgets(mesgptr->mesg_data, MAXMESGDATA, stdin) == NULL)
err_sys("filename read error");
n = strlen(mesgptr->mesg_data);
if (mesgptr->mesg_data[n-1] == '\n')
n--;
mesgptr->mesg_len = n;
sem_signal(servsem);
sem_wait(clisem);
while( (n = mesgptr->mesg_len) > 0) {
if (write(1, mesgptr->mesg_data, n) != n)
err_sys("data write error");
sem_signal(servsem);
sem_wait(clisem);
}
if (n < 0)
err_sys("data read error");
}


댓글 달기