You are on page 1of 11

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA CÔNG NGHỆ THÔNG TIN

Chương 8. GIAO TIẾP LIÊN TIẾN TRÌNH

GVC.ThS. Trần Hồ Thuỷ Tiên

11/04/09
Mục đích

• Giúp sinh viên hiểu sâu hơn về tiến trình và cách quản
lý tiến trình trên hệ điều hành Linux.
• Nắm được các kỹ thuật giao tiếp liên Tiến trình trong
lập trình đa Tiến trình.
• Vận dụng giải quyết được các bài toán thực tế.

2
11/04/09
Giao tiếp giữa các Tiến trình

Có 5 kiểu giao tiếp giữa các Tiến trình


Bộ nhớ chia sẻ (Shared memory).
Bộ nhớ ánh xạ (Mapped memory).
Giao tiếp bằng đường ống (Pipes).
FIFO.
Socket.

3
11/04/09
Bộ nhớ chia sẻ (Shared memory)

Cho phép các tiến trình giao tiếp bằng cách đọc và ghi lên một vùng nhớ được chỉ ra.
Đây là cách đơn giản nhất cho phép hai hay nhiều tiến trình giao tiếp với nhau bằng cách
truy cập đến cùng bộ nhớ.
Khi một tiến trình thay đổi bộ nhớ, tất cả các tiến trình khác cũng sẽ thay đổi theo.
Một số hàm thông dụng:
#include <sys/shm.h>
#include <sys/stat.h>

1. Hàm tạo phân đoạn bộ nhớ chung


int shmget(int key, int shared_segment_size, int flag);
- key: chỉ phân đoạn được tạo ra. Sử dụng hằng IPC_PRIVATE mặc định tạo ra phân đoạn
mới.
- shared_segment_size: số byte của phân đoạn. Vì segment cấp phát phân trang nên số byte là
bội số của 1 trang.

4
11/04/09
Bộ nhớ chia sẻ (Shared memory)

- flag: Giá trị của flag có thể là:


IPC_CREAT: chỉ rõ một segment mới sẽ được tạo.
IPC_EXCL: luôn được dùng với IPC_CREAT, tạo ra lỗi nếu segment đã tồn tại. Nếu
flag này không chỉ ra và key của một segment đã dùng, shmget trả về segment đã tồn tại
thay vì tạo ra một segment mới.
Mode flag: 9 bits liên quan đến owner, group, và cách truy cập đến segment. Các hằng này
được định nghĩa trong <sys/stat.h>. (Chẳng hạn: S_IRUSR, S_IWUSR, S_IROTH,
S_IWOTH,...)
Ví dụ:
int segment_id = shmget (shm_key, getpagesize(), IPC_CREAT | S_IRUSR |
S_IWUSR);
=> Nếu lời gọi thành công, shmget trả về phân đoạn. Nếu phân đoạn sẵn sàng, cho phép truy
cập.

5
11/04/09
Bộ nhớ chia sẻ (Shared memory)

2. Hàm gắn kết phân đoạn bộ nhớ chung


char *shmat(int segment_id, int * address, int flag);
- segment_id: SHMID trả về bởi hàm shmget.
- address: con trỏ trỏ đến địa của segment mà ở đó ta cần ánh xạ. Nếu chỉ NULL (0), Linux sẽ
chọn địa chỉ có giá trị.
- flag: có thể là các hằng sau:
SHM_RND: làm tròn xuống bội số của kích thước trang,
SHM_RDONLY: segment chỉ đọc, không được ghi.
=> Nếu lời gọi thành công thì trả về địa chỉ của phân đoạn dùng chung. Tiến trình con được tạo
ra bởi hàm fork() có thể được gắn kết vào phân đoạn này, và có thể gỡ bỏ nếu muốn.

6
11/04/09
Bộ nhớ chia sẻ (Shared memory)

3. Hàm gỡ bỏ gắn kết phân đoạn bộ nhớ chung


Khi dùng xong phân đoạn bộ nhớ chung, chúng phải được gỡ bỏ, dùng hàm:
char *shmdt(char *address);
- address: địa chỉ trả về bởi shmat.
=> Nếu phân đoạn được cấp phát lại, tiến trình sau cùng sử dụng nó.
4. Hàm chỉ định kích thước phân đoạn
void shmctl(int segment_id, struct shmid_ds *pointer, struct shmid_ds *shmbuffer);
- segment_id: chỉ ra phân đoạn bộ nhớ,
- pointer: Chỉ ra thông tin về phân đoạn bộ nhớ dùng chung. Có thể là các hằng sau:
IPC_STAT: Con trỏ trỏ đến struct shmid_ds.
IPC_RMID: Xoá phân đoạn, và đối số thứ 3 phải là NULL

7
11/04/09
Bộ nhớ chia sẻ (Shared memory)

Ví dụ: Chương trình bộ nhớ chia sẽ shm.c


#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main()
{
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;

continues
8
11/04/09
Bộ nhớ chia sẻ (Shared memory)

/* Chi ra shared memory segment */


segment_id = shmget(IPC_PRIVATE, shared_segment_size, IPC_CREAT | IPC_EXCL |
S_IRUSR | S_IWUSR);
/* Gan ket phan doan bo nho chung*/
shared_memory = (char*) shmat(segment_id, 0, 0);
printf("Bo nho chia se gan ket den dia chi %p\n", shared_memory);
/* Chi dinh kich thuoc phan doan */
shmctl(segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf("Kich thuoc segment: %d\n", segment_size);
/* Ghi mot chuoi len phan doan bo nho dung chung*/
sprintf(shared_memory, "Hello, hello, hello!!!");
/* Go bo gan ket phan doan bo nho chung*/
9 shmdt(shared_memory); continues
11/04/09
Bộ nhớ chia sẻ (Shared memory)

/* Gan ket lai phan doan bo nho chung voi dia chi khac*/
shared_memory = (char*) shmat(segment_id, (void*) 0x5000000, 0);
printf("Bo nho chia se gan ket lai den dia chi %p\n", shared_memory);
/* In ra chuoi tu bo nho chia se*/
printf("%s \n", shared_memory);
/* Go bo gan ket phan doan bo nho chung*/
shmdt(shared_memory);
/* Chi dinh lai kich thuoc phan doan */
shmctl(segment_id, IPC_RMID,0);
return 0;
}
=> Biên dịch và chạy chương trình từ dòng lệnh.
=> Tại terminal gõ lệnh
10 $ ipcs -m
11/04/09
KẾT THÚC

11
11/04/09

You might also like