Đang tải... (xem toàn văn)
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... B: K t Qu Demo:ế ả
Trang 1TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP NMHĐHHK2, 2022-2023
Lab 8
Trang 3int 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);
Trang 4switch (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ế ả
Trang 5B 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;
Trang 6scanf("%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;
}}
Trang 7B: 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 toá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() {
Trang 8int *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);
Trang 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;}
Trang 10B: K t Qu Demo:ế ả
C K T LU NẾẬ
Sau khi học và hoàn thành phần lab 8 nhóm thu được kết sau:1 Shared Memory:
vùng nhớ chia sẻ giữa các tiến trình.
shmget tạo một đoạn shared memory hoặc kết nối đến một đoạn đã
fork được sử dụng để tạo một bản sao của tiến trình hiện tại.
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.
3 Xử lý Lỗi:
vấn đề xảy ra.
Trang 11Hàm exit được sử dụng để kết thúc tiến trình nếu có lỗi.
4 Đồng Bộ Hóa:
wait được sử dụng để đảm bảo rằng cha đợi cho đến khi tiến trình
con hoà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.