1. Pipe
if(pipe(file_pipes)>=0)
{
fork_result = fork();
if(fork_result == -1){
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
if(fork_result == 0){
sleep(1);
data_processed = read(file_pipes[0], buffer, sizeof(buffer));
printf("Read %d bytes : %s\n", data_processed, buffer);
exit(EXIT_SUCCESS);
}
else{
data_processed = write(file_pipes[1], &some_data, 3);
printf("Wrote %d bytes\n", data_processed);
}
}
exit(EXIT_SUCCESS);
if(pipe(file_pipes)>=0) 를 통해 파이프를 연다. 그리고 에러가 없다면, (즉 0보다 큰 값을 리턴 하게 되면) fork한다.
부모 프로세스일 경우(else) 파이프에 ‘some_data’를 3바이트만큼 write한다. 출력 시 파이프의 변수인 file_pipes[1]을 이용한다. 그리고 파이프에 쓴 바이트 수를 "Wrote %d bytes\n", data_processed form으로 출력한다.
그리고 만약 자식 프로세스 일 경우(fork_result==0) 부모 프로세스에서 파이프에 ‘some_data’의 내용을 쓸 동안 기다리기 위해 1초간 sleep하고 파이프에서 read하여 buffer에 쓴다. 그리고 읽은 바이트 수와 버퍼에 쓴 내용을 "Read %d bytes : %s\n", data_processed, buffer의 form으로 출력한다.
2.Shared Memory
shm1.c
#define KEY_NUM 9527
int main()
{
int running = 1;
void *shared_memory = (void*)0;
struct shared_use_st *shared_stuff;
int shmid;
srand((unsigned int)getpid());
shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666 | IPC_CREAT);
printf("%d", shmid);
if(shmid == -1)
{
fprintf(stderr, "shmget failed1\n");
exit(EXIT_SUCCESS);
}
shared_memory = shmat(shmid, (void *)0, 0);
if(shared_memory == (void*)-1){
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
shared_stuff = (struct shared_use_st *)shared_memory;
shared_stuff->written_by_you = 0;
while(running){
if(shared_stuff->written_by_you){
printf("You wrote: %s", shared_stuff->some_text);
sleep(rand() % 4);
shared_stuff->written_by_you =0;
if(strncmp(shared_stuff->some_text, "end",3)==0){
running = 0;
}
}
}
if(shmdt(shared_memory)==-1){
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
}
if(shmctl(shmid, IPC_RMID,0)==-1){
fprintf(stderr, "shmctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666|IPC_CREAT); 형태로 공유 메모리를 생성한다. KEY_NUM 은 상위에 define으로 세팅되어 있다.
생성된 공유 메모리는 shared_memory = shmat(shmid,(void *)0, 0);을 이용하여 연결한다.
만약 입력 받은 데이터가 0이면 if(strncmp(shared_stuff->some_text, "end",3)==0)
종료시킨다.
shmdt(shared_memory)를 통해 공유메모리 연결을 삭제한다.
Shmctl(shmid, IPC_RMID, 0)을 통해 공유메모리를 삭제한다.
shm2.c
#define KEY_NUM 9527
int main()
{
int running = 1;
void *shared_memory =(void*)0;
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid;
shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if(shmid == -1){
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
}
shared_memory = shmat(shmid,(void *)0, 0); //shmat();
if(shared_memory == (void*)-1){
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X\n", (int)shared_memory);
shared_stuff = (struct shared_use_st *)shared_memory;
while(running)
{
while(shared_stuff->written_by_you==1){
sleep(1);
printf("waiting for client...\n");
}
printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin);
strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
shared_stuff->written_by_you = 1;
if(strncmp(buffer, "end",3)==0){
running =0;
}
}
if(shmdt(shared_memory)==-1){
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666|IPC_CREAT); 형태로 공유 메모리를 생성한다. KEY_NUM 은 1번 파일과 마찬가지로 define으로 설정되어 있다.
생성된 공유 메모리는 shared_memory = shmat(shmid,(void *)0, 0);을 이용하여 연결하고 연결 될 주소는 printf("Memory attached at %X\n", (int)shared_memory);의 format으로 출력한다.
while(shared_stuff->written_by_you==1){
sleep(1);
printf("waiting for client...\n");
}
을 이용하여 구조체의 written_by_you 의 값이 1이면 1초간 슬립하고 fgets(buffer, BUFSIZ, stdin); fgets를 이용하여 buffer에 입력한 내용을 쓴다.
strncpy(shared_stuff->some_text, buffer, TEXT_SZ);을 이용해 buffer을 공유 메모리에 쓰게 된다.
만약 입력받은 문자열이 end라면 if(strncmp(buffer, "end",3)==0) 종료시킨다.
shmdt(shared_memory)를 통해 공유메모리 연결을 삭제한다.
'Studying!! > 공부를하자' 카테고리의 다른 글
Op-Amp 기본 (0) | 2010.10.13 |
---|---|
트랜지스터 (1) | 2010.10.06 |
어셈블리 Linked List Operation (insert/remove/sort/search/empty) (0) | 2008.11.18 |
Linux Scheduler 분석 (0) | 2008.11.17 |
어셈블리 strcmp_length strcmp_byte 구현 (0) | 2008.10.17 |