lập trình ipchungnq/courses/os/ct09quee/... · void *shmat(int shmid,void *shmaddr,int shmflg);...

23
Lập trình IPC Bộ môn Hệ thống Mạng máy tính Khoa Khoa học kỹ thuật máy tính Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 1

Upload: others

Post on 05-Jun-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lập trình IPC

Bộ môn Hệ thống và Mạng máy tính

Khoa Khoa học và kỹ thuật máy tính

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 1

Page 2: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lập trình trên Linux Lập trình IPC

Dùng signal

Dùng shared memories

2 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM

Page 3: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lập trình trên Linux Lập trình IPC

Dùng signal

Dùng shared memories

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 3

Page 4: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Signals Dựa vào các sự kiện bất đồng bộ.

Kernel có nhiệm vụ gửi (deliver) sự kiện đến process

Các process có thể tự thiết lập các hành vi ứng xử tương

ứng với sự kiện nhận được.

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 4

Process

signals

(events)

Page 5: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Một số signals thường gặp SIGKILL

SIGSTOP

SIGPIPE

SIGINT

SIGQUIT

Tham khảo thêm dùng các lệnh sau

$ man 7 signal hoặc $ info signal

$ kill -l

$ more /usr/include/bits/signum.h

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 5

Page 6: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Các nguồn tạo signal Từ kernel

Khi xảy ra một số điều kiện về phần cứng (SIGSEGV, SIGFPE)

Khi xảy ra điều kiện phần mềm (SIGIO)

Từ user

Tổ hợp phím: Ctrl+C, Ctrl+Z, Ctrl+\

Khi user dùng lệnh kill

Từ một process thực hiện system call kill()

#include <sys/types.h>

#include <signal.h>

int kill(pid_t pid, int sig);

Từ lời gọi system call alarm() → tạo ra SIGALRM

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 6

Page 7: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lập trình với signal #include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t

handler);

int sigaction(int signum, const struct sigaction

*act, struct sigaction *oldact);

int sighold(int sig);

int sigrelse(int sig);

int sigignore(int sig);

int sigpause(int sig);

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 7

Page 8: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lập trình với signal (2)

sighandler_t signal(int signum, sighandler_t

handler);

Thay đổi hành vi của process đối với signal

Tham số của hàm signal()

signum: là số hiệu signal mà bạn muốn thay đổi hành vi (trừ SIGKILL hay SIGSTOP) - dạng số hay symbolic

handler: hành vi mới đối với signal, các giá trị có thể là:

SIG_DFL: thiết lập lại hành vi về mặc định (default)

SIG_IGN: lờ đi (ignore) signal tương ứng

Tham chiếu đến hàm xử lý sự kiện (signal-handler) mới do người dùng tự định nghĩa

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 8

Page 9: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lờ đi signal

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 9

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <stdlib.h>

int main() {

if (signal(SIGINT, SIG_IGN)==SIG_ERR)

{

perror("SIGINT\n");

exit(3);

}

while (1);

return 0;

}

Dịch vàthực thi

$gcc sigign.c –o

sigign

$./sigign

^C

^C

^C

Page 10: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Định nghĩa hành vi mới #include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <stdlib.h>

void newhandler(int sig) {

printf("\nI received signal %d",sig);

}

int main() {

int i=0;

if (signal(SIGINT,newhandler)==SIG_ERR){

perror("\nSIGINT");

exit(3);

}

while (1);

return 0;

} Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 10

Dịch vàthực thi

$gcc sig2.c -o sig2

$./sig2

^C

I received signal 2

^C

I received signal 2

^C

I received signal 2

Page 11: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lập trình trên Linux Lập trình IPC

Dùng signal

Dùng shared memories

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 11

Page 12: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Shared memory

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 12

Process 1

Process 2

Process 1

Process 2

xy

xy

xy

Page 13: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Shared memory Có thể theo dõi trạng thái bằng lệnh ipcs, ipcs -a, ipcs -m

Loại bỏ một shared memory bằng lệnh ipcrm shm shm_id, ipcrm -m shm_id

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 13

$ipcs

------Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 65536 root 644 110592 11 dest

------Semaphore Arrays --------

key semid owner perms nsems status

------Message Queues --------

key msqid owner perms used-bytes messages

Page 14: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Shared memory Cho phép nhiều process dùng chung một vùng bộnhớ

Kích thước tối thiểu/tối đa của vùng là 1byte/4MB

Số vùng nhớ chia sẻ tối đa trong toàn hệ thống: 4096

Cách sử dụng

Vùng nhớ chia sẻ phải được tạo ra trước

Process phải gắn vùng nhớ chia sẻ vào không gian địa chỉ

của mình trước khi sử dụng.

Sau khi dùng xong có thể gỡ vùng nhớ chia sẻ ra khỏi

không gian địa chỉ của process

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 14

Page 15: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Thao tác với shared memory Tạo shared memory

shmget()

Lấy hoặc thay đổi thuộc tính của shared memory

shmctl()

Gắn shared memory vào address space của process

shmat()

Gỡ shared memory khỏi không gian địa chỉ của process

shmdt()

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 15

Page 16: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Tạo shared memory segment #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t key,int size,int shmflg);

key: key tương ứng với shared memory

size: kích thước (tính theo đơn vị byte)

shmflg: tương tự như semflg của semget(), nhưng không có

IPC_EXCL

Ví dụ

shm_id = shmget(123, 4096, IPC_CREAT | 0660)

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 16

Page 17: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Gắn shared memory #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

void *shmat(int shmid,void *shmaddr,int shmflg);

shmid: shared memory ID trả về từ hàm shmget()

shmaddr: địa chỉ nơi gắn vùng nhớ chia sẻ

shmflg: SHM_RDONLY (read-only) hoặc 0

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 17

Page 18: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Gỡ shared memory #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmdt(void *shmaddr);

shmaddr: địa chỉ nơi gắn vùng nhớ chia sẻ (chính là kết

quả trả về từ hàm shmat())

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 18

Page 19: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Lấy thông tin và thay đổi

thuộc tính #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmctl(int shmid,int cmd,struct shmid_ds *buf);

shmid: shared memory ID trả về từ hàm shmget().

cmd: IPC_STAT, IPC_SET and IPC_RMID

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 19

Page 20: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Ví dụ Tạo shared memory 128 bytes

Hai process dùng chung shared memory

Process thứ nhất ghi 2 integer vào shared memory

Process thứ hai đọc từ shared meomory và ghi tổng hai số

vào shared memory

Process thứ nhất đọc tổng và hiển thị ra

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 20

Page 21: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Ví dụ int main() {

int *shm, shmid, k;

shmid = shmget(IPC_PRIVATE,128,IPC_CREAT|0666);

shm = (int*) shmat(shmid,0,0);

if(fork()==0) { /*child*/

shm[0]=111;

shm[1]=999;

sleep(3);

pintf("Process %d reads: Sum = %d",

getpid(),shm[2]);

shmdt((void *)shm);

shmctl(shmid, IPC_RMID, (struct shmid_ds *)0);

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 21

Page 22: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Ví dụ (cont) }

else { /*parent*/

sleep(1);

printf("Process %d writes to shared memory

...\n", getpid());

shm[2]=shm[0]+shm[1];

shmdt((void *)shm);

}

return(0);

}

Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 22

Page 23: Lập trình IPChungnq/courses/os/CT09QUEE/... · void *shmat(int shmid,void *shmaddr,int shmflg); shmid: shared memory ID trả về từ hàm shmget() shmaddr: địa chỉ nơi

Questions???