Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (589.08 KB, 11 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN </b>
int main(int agrc, char* argv[]){
int *shm, shmid, k; key_t key;
if ((key = ftok(".", 'a')) == -1) {
perror("key created\n"); return 1;
}
if ((shmid = shmget(key, SIZE, IPC_CREAT | 0666)) == -1) {
perror("SM created\n"); return 2;
}
shm = (int*) shmat(shmid, 0, 0);
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">switch (fork()) {
case -1:
perror("fork error\n"); return 4;
case 0:
shm[0] = atoi(argv[1]); shm[1] = atoi(argv[2]); sleep(3);
printf("%d + %d = %d\n", shm[0], shm[1], shm[2]); shmdt((void*) shm);
shmctl(shmid, IPC_RMID, (struct shmid_ds*) 0); return 0;
default: sleep(1);
shm[2] = shm[1] + shm[0]; shmdt((void*) shm); sleep(5);
return 0; }
return 0;}
B: K t Qu Demoế ả
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">Bài t p 1:ậ
Tiến trình con ghi một mảng vào SM_0, với SM [0] chứa số phần tử của mảng.Tiến trình cha lấy tổng các phần tử của mảng và ghi vào cuối SM_1. Quá trìnhnhận và xuất dữ liệu ra màn hình (lưu ý sử dụng 2 SM).
A: Code Chươ ng Trình:
// bai1.c
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SIZE 256int main() {
key_t key = ftok(".", 'a');
int shmid = shmget(key, SIZE, IPC_CREAT | 0666); int *shm = (int*) shmat(shmid, 0, 0);
switch (fork()) { case -1:
perror("Lỗi fork\n"); return 1;
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">scanf("%d", &shm[i]); }
shmdt((void*) shm); return 0;
printf("Tổng các phần tử trong mảng: %d\n", sum); shmdt((void*) shm);
shmctl(shmid, IPC_RMID, NULL); return 0;
}}
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">B: K t Qu Demo:ế ả
Bài t p 2:ậ
Tiến trình con đọc dữ liệu từ một tệp gồm hai số nguyên và một phép toán +, -,*, / và chuyển tất cả cho tiến trình cha (bằng Hàng đợi Thơng báo). Tiến trìnhcha tính tốn kết quả và trả về cho tiến trình con. Tiến trình con ghi kết quả vàotập tin.
A: Code Chươ ng Trình:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/wait.h>#define SIZE 256int main() {
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">int *shm, shmid;
// Tạo đoạn shared memory
if ((shmid = shmget(IPC_PRIVATE, SIZE * sizeof(int), IPC_CREAT | 0666))== -1) {
perror("shmget"); exit(1);
}
// Gắn kết với đoạn shared memory
if ((shm = shmat(shmid, NULL, 0)) == (int *) -1) { perror("shmat");
exit(1); }
switch (fork()) { case -1:
perror("fork error"); exit(1);
case 0: // Tiến trình con
printf("Tiến trình con: Nhập hai số nguyên và một phép toán (+, -, *, /): ");
scanf("%d %d %c", &shm[0], &shm[1], (char*)&shm[2]); // Tách khỏi shared memory
shmdt(shm); break;
default: // Tiến trình cha
wait(NULL); // Đợi tiến trình con kết thúc // Gắn kết với đoạn shared memory lại
if ((shm = shmat(shmid, NULL, 0)) == (int *) -1) { perror("shmat");
exit(1);
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">} int result; switch (shm[2]) { case '+':
result = shm[0] + shm[1]; break;
case '-':
result = shm[0] - shm[1]; break;
case '*':
result = shm[0] * shm[1]; break;
case '/':
result = shm[0] / shm[1]; break;
} return 0;}
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">B: K t Qu Demo:ế ả
<b>Sau khi học và hồn thành phần lab 8 nhóm thu được kết sau:1. Shared Memory:</b>
vùng nhớ chia sẻ giữa các tiến trình.
<b>shmget tạo một đoạn shared memory hoặc kết nối đến một đoạn đã </b>
<b>fork được sử dụng để tạo một bản sao của tiến trình hiện tại.</b>
Trong trường hợp cha và con, mỗi tiến trình có thể thực hiện cơng việc riêng biệt.
Tiến trình con có thể gửi dữ liệu cho tiến trình cha và ngược lại thơng qua shared memory.
<b>3. Xử lý Lỗi:</b>
vấn đề xảy ra.
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">Hàm <b>exit</b> được sử dụng để kết thúc tiến trình nếu có lỗi.
<b>4. Đồng Bộ Hóa:</b>
<b>wait được sử dụng để đảm bảo rằng cha đợi cho đến khi tiến trình </b>
con hồn thành cơng việc của mình trước khi tiếp tục thực hiện cơng việc của mình.
</div>