1. Trang chủ
  2. » Tất cả

BAO cáo THỰ HÀNH lab6 7

13 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 13
Dung lượng 295,93 KB

Nội dung

Báo cáo thực hành lab 6 nhập môn hệ điều hành, các bạn có thể tải xuống để ủng hộ và tham khảo với giá 2000d. cảm ơn các bạn đã ủng hộ rất nhiều. Đây cam kết là bài của tôi tự làm và đạt điểm khá cao.

1 TRƯỜ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ĐH HK2, 2021-2022 Lab 6-7 Nhóm: 07 Tổ: 01 Thành Viên Nhóm: 1: Trần Hữu Nhân ( MSSV: 521H0507) Mục lục A Phần thực hành Ví Dụ 1: Pipes Ví dụ 1.1 Unname pipe: .3 Ví dụ 1.2 Named pipe Ví dụ 2: share memory Ví dụ 2.1: Ví dụ 3: Message queues Ví dụ 3.1: Ví dụ 3.2: Ví dụ 3.3 10 BÀI 1: Viết chương trình tính giai thừa 13 1a) sử dụng unnamed pipe .13 A PHẦN THỰC HÀNH Ví Dụ 1: Pipes Ví dụ 1.1 Unname pipe: - Tiến trình đọc liệu từ đối số truyền, ghi vào pipe - Tiến trình cha đọc từ pipe xuất hình A: Code Chương Trình #include #include #include int main(int argc, char *argv[]) { char result[100]; //mang luu ki tu int fp[2]; int pid; // process id //kiểm tra số lượng đối số if (argc < 2) // trường hợp đối số thiếu { printf("Doi so thieu.\n"); return -1; } // đối số đủ if (pipe(fp) == 0) // hàm tạo unname pipe thành cơng { pid = fork(); // hàm tạo tiến trình if (pid < 0) //tạo tiến trình thất bại { printf("Fork failed\n"); return -1; } else if (pid == 0) // tiến trình { printf("Data from child: %s\n", argv[1]); close(fp[0]); // đóng file ghi write(fp[1], argv[1], strlen(argv[1])); } else // pid > tức tiến trình cha { close(fp[1]); // đóng file đọc read(fp[0], result, strlen(argv[1])); // đọc printf("Read from child: %s\n", result); } } // pipe không thành công else { printf("Pipe failed\n"); return -2; } } B: Kết Quả Demo Ví dụ 1.2 Named pipe Tiến trình cha ghi liệu vào pipe - Tiến trình vào đọc, hiển thị liệu, ghi liệu phản hồi - Tiến trình cha đọc liệu phản hồi hiển thị hình A: Code chương trình #include #include #include #include #include #include #include #define FIFO1 "/tmp/ff.1" #define FIFO2 "/tmp/ff.2" #define PM 0666 extern int errno; #define PIPE_BUF 4096 int main(int argc, char *argv[]) { char s1[PIPE_BUF], s2[PIPE_BUF]; int childpid, readfd, writefd; if ((mknod(FIFO1, S_IFIFO | PM, 0) < 0) && (errno != EEXIST)) // hàm khởi tạo named pipe < thất bại { printf("Fail to create FIFO Aborted.\n"); return -1; } if ((mknod(FIFO2, S_IFIFO | PM, 0) < 0) && (errno != EEXIST)) { unlink(FIFO1); printf("Fail to create FIFO Aborted.\n"); return -1; } // tạo tiến trình hàm fork childpid = fork(); if (childpid == 0) { // tiến trình read(readfd, s2, PIPE_BUF); // đọc liệu vào readfd printf("Child read from parent: %s\n", s2); // in nội dung đọc hình printf("Enter response: "); // nhập phản hồi fgets(s1, PIPE_BUF, stdin); // đọc chuỗi hàm fgets write(writefd, s1, strlen(s1)); // ghi vào writefd // close(readfd); // đóng file đọc // close(writefd); // đóng file ghi return 1; } else if (childpid > 0) { // tiến trình cha printf("Enter data to FIFO1: "); fgets(s1, PIPE_BUF, stdin); // đọc liệu hàm fgets write(writefd, s1, strlen(s1));// ghi vào writfd read(readfd, s2, PIPE_BUF); // đọc vào readfd printf("Parent read from child: %s\n", s2); // ghi nội dung đọc từ child close(readfd); // đóng readfd, writefd close(writefd); // kiểm tra xóa FIFO1 chưa if (unlink(FIFO1) < 0) perror("Cannot remove FIFO1.\n"); if (unlink(FIFO2) < 0) perror("Cannot remove FIFO2.\n"); return 1; } else { // fork không thành công printf("Fork failed\n"); return -1; } } B: kết demo Ví dụ 2: share memory Ví dụ 2.1: Tiến trình đọc vào số nguyên từ đối số truyền, ghi vào SM, tiến trình cha thực tính tổng ghi lại vào SM Tiến trình đọc kết xuất hình A: Code chương trình #include #include #include #include #include #include #include #include #define SIZE 256 int main(int argc, char *argv[]) { int *shm, shmid, k; key_t key; if ((key = ftok(".", 'a')) == -1) { perror("Key created.\n"); return 1; } // tạo SM if ((shmid = shmget(key, SIZE, IPC_CREAT | 0666)) == -1) { perror("Shared memory created.\n"); return 2; } //hàm gỡ SM khỏi tiến trình shm = (int *)shmat(shmid, 0, 0); int pid = fork(); // tạo tiến trình if (pid == 0) { // tiến trình shm[0] = atoi(argv[1]); // số thứ shm[1] = atoi(argv[2]); // só thứ sleep(3); printf("% d + % d = % d\n", shm[0], shm[1], shm[2]); // in tổng số shmdt((void *)shm); // shmctl((shmid, IPC_RMID, (struct shmid_ds*)argv)); return 0; } else if (pid > 0) { // tiến trình cha sleep(1); // thực tính tổng shm[2] = shm[1] + shm[0]; // gỡ hàm khỏi tiến trình shmdt((void *)shm); sleep(5); return 0; } else { perror("Fork failed."); return 4; } return 0; } B: Kết Demo Ví dụ 3: Message queues Ví dụ 3.1: A: Code chương trình #include #include #include int main(int argc, char *argv[]) { key_t key; char i; for (i = 'a'; i < 'e'; i++) { key = ftok(".", i); printf("Proj = %c key = %d.\n", i, key); } return 0; } B: kết demo Ví dụ 3.2: A: code chương trình #include #include #include #include #include #include #define MAX int main(int argc, char *argv[]) { FILE *fin; char buffer[PIPE_BUF], proj = 'A'; int i, n, mid[MAX]; key_t key; for (i = 0; i < MAX; i++, proj++) { key = ftok(".", proj); 10 if (mid[i] = msgget(key, IPC_CREAT | 0666) == -1) { perror("Queue created.\n"); return 1; } } fin = popen("ipcs -s", "r"); while ((n = read(fileno(fin), buffer, PIPE_BUF)) > 0) write(fileno(stdout), buffer, n); pclose(fin); for (i = 0; i < MAX; i++) msgctl(mid[i], IPC_RMID, (struct msqid_ds *)0); return 0; } B: kết demo Ví dụ 3.3 A:code chương trình #include #include #include 11 #include #include #include #define MAX int main(int argc, char *argv[]) { FILE *fin; char buffer[PIPE_BUF], proj = 'A'; int i, n, mid[MAX]; key_t key; for (i = 0; i < MAX; i++, proj++) { key = ftok(".", proj); if (mid[i] = msgget(key, IPC_CREAT | 0666) == -1) { perror("Queue created.\n"); return 1; } } fin = popen("ipcs -q", "r"); while ((n = read(fileno(fin), buffer, PIPE_BUF)) > 0) write(fileno(stdout), buffer, n); pclose(fin); for (i = 0; i < MAX; i++) msgctl(mid[i], IPC_RMID, (struct msqid_ds *)0); return 0; } B: kết demo 12 B PHẦN BÀI TẬP BÀI 1: Viết chương trình tính giai thừa 1a) sử dụng unnamed pipe A: Code Chương Trình: #include #include #include #include int main(int argc, char **argv) { int pfds[2]; int n, f = 1, i, n1; pipe(pfds); // tạo unname pipes // tạo tiến trình if (!fork()) // child { n = atoi(argv[1]); for (i = 1; i

Ngày đăng: 20/11/2022, 11:28

w