Tải bản đầy đủ (.pdf) (11 trang)

báo cáo bài tập nhập môn hệ điều hành lab 8

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>

<b>BÁO CÁO BÀI TẬP NMHĐHHK2, 2022-2023</b>

<b>Lab 8</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

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. PH N BÀI T PẦẬ

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:ế ả

C. K T LU NẾẬ

<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>

×