<NETWORK>



==공유메모리




: shmget() :


: shmat() : attach

: shmdt() : detach

: shmctl() : 관리


-확인

: ipcs -m



-

<sharedmem.c>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    key_t keyval 
= 2345;
    
int shmid;
    shmid = shmget(keyval, 
1024, IPC_CREAT |0666);
    
if(shmid == -1)
    {
        printf(
"shm Create failure\n");
        
return 1;
    }
    printf(
"shm Create success\n");
    
return 0;
}



:권한

        소유자  그룹    기타

-666 :  rwx    rwx    rwx

        110    110    110




-

<shm_producer>실행 전/후









-

<shm_procuder.c>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    
int shmid;

    
int *cal_num;
    
void *shared_memory = NULL;

    
shmid = shmget((key_t) 1234sizeof(int), 0666|IPC_CREAT);
    
if(shmid == -1)
    {
        perror(
"shmget failed : ");
        exit(
0);
    }

    
shared_memory = shmat(shmid, NULL, 0);
    
if(shared_memory == (void *)-1)
    {
        perror(
"shmat failed : ");
        exit(
0);
    }

    
cal_num = (int *)shared_memory;
    
while(1)
    {
        
*cal_num = *cal_num +2;
        sleep(
1);
    }
    
return 0;
}


<shm_consumer.c>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
    
int shmid;

    
int *cal_num;
    
void *shared_memory = NULL;

    
shmid =shmget((key_t)1234sizeof(int), 0);
    
if(shmid == -1)
    {
        perror(
"shmget failed : ");
        exit(
0);
    }

   
 shared_memory = shmat(shmid, NULL, 0);
    
if(shared_memory == (void *)-1)
    {
        perror(
"shmat failed : ");
        exit(
0);
    }

    
cal_num = (int *)shared_memory;

    
while(1)
    {
        sleep(
1);
        printf(
"Read Data : %d\n", *cal_num);
    }
    
return 0;
}








1. 멀티 P : PROCESS 여러개

2. 멀티 T : PROCESS 1개 THREAD 여러개

3. 다중 입출력 : PROCESS 1개





==세마포어(키)


(비행기 좌석 예약 : 같은좌석 중복 예약 안되도록 한사람이 예약 하는 동안 lock) : 동기화

=> 공유메모리 / 파이프 사용 불가 => 세마포어 사용(


<shm_producer_sem.c>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

union semun
{
  
int val;
};

int main(int argc, char **argv)
{
  
int shmid;
  
int semid;

  
int *cal_num;
  
void *shared_memory = NULL;
  
union semun sem_union;

  
struct sembuf semopen = { 0, -1, SEM_UNDO};
  
struct sembuf semclose = { 01, SEM_UNDO};

  shmid 
= shmget((key_t)1234sizeof(int), 0666|IPC_CREAT);
  
if(shmid == -1)
  {
    
return 1;
  }

  semid 
= semget((key_t)34771, IPC_CREAT|0666);
  
if(semid == -1)
  {
    
return 1;
  }

  shared_memory 
= shmat(shmid, NULL, 0);
  
if(shared_memory == (void *)-1)
  {
    
return 1;
  }

  cal_num 
= (int *)shared_memory;
  sem_union.val 
= 1;
  
if(-1 == semctl(semid, 0, SETVAL, sem_union))
  {
    
return 1;
  }

  
while(1)
  {
    
int local_var = 0;
    
if(semop(semid, &semopen, 1== -1)
    {
      
return 1;
    }
    local_var 
= *cal_num +1;
    sleep(
1);
    *cal_num 
= local_var;
    printf(
"%d\n", *cal_num);
    semop(semid, 
&semclose, 1);
  }
  
return 0;
}


<shm_consumer_sem.c>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  
int shmid;
  
int semid;

  
int *cal_num;
  
void *shared_memory = NULL;

  
struct sembuf semopen = {0, -1, SEM_UNDO};
  
struct sembuf semclose = {01, SEM_UNDO};

  shmid 
= shmget((key_t)1234sizeof(int), 0666);
  
if(shmid ==-1)
  {
    perror(
"shmget failed : ");
    exit(
0);
  }

  semid 
= semget((key_t) 347700666);
  
if(semid == -1)
  {
    perror(
"semget failed : ");
    
return 1;
  }

  shared_memory 
= shmat(shmid, NULL, 0);
  
if(shared_memory == (void *)-1)
  {
    perror(
"shmat failed : ");
    exit(
0);
  }

  cal_num 
= (int *)shared_memory;

  
while(1)
  {
    
int local_var = 0;
    
// 세마포어 획득 실패시 : IPC_NOWAIT 아니므로 무한대기
    if(semop(semid, &semopen, 1== -1
    {
      perror(
"semop error : ");
    }
    local_var 
= *cal_num +1;
    sleep(
2);
    *cal_num 
= local_var;
    printf(
"count %d\n", *cal_num);
    semop(semid, 
&semclose, 1);
  }
  
return 0;
}



=












=시그널(소프트웨어 인터럽트: ctrl+C)(자바: 이벤트)(윈도우: 메세지)









<sig1.c>


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void smart(int iNum)
{
    printf(
"INTERRUPT : %d\n", iNum);
    
//exit(0);
}

int main()
{
    signal(SIGINT, smart);
    
while(1)
    {
        sleep(
1);
        printf(
"-----------------------------\n");
    }
    
return 0;
}





void (*)(int);

- ^z : 프로세스 stop

- fg : foregrouond

- bg : background








=채팅프로그램



'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150812  (0) 2015.08.13
20150811  (0) 2015.08.11
20150731  (0) 2015.08.10
20150730  (0) 2015.07.31
20150729  (0) 2015.07.30
Posted by ahj333
,