1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

17 1 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Báo Cáo Bài Tập Nhập Môn Hệ Điều Hành Lab 6
Tác giả Ngô Xuân Bình
Trường học Trường Đại Học Tôn Đức Thắng
Chuyên ngành Công Nghệ Thông Tin
Thể loại báo cáo
Năm xuất bản 2022-2023
Định dạng
Số trang 17
Dung lượng 919,34 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tiến trình con tính toán kết quả và trả về kết quả cho tiến trình cha.. Tiến trình cha ghi kết quả vào một tập tin.V nấ đ 1:ềA: Code Chươ ng Trình://Unnamed_Pipe/bai1.c#include #include

Trang 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, 2022-2023

Lab 6 Nhóm: O1 Tổ: 02

Trang 2

Mục lục

Contents

A PHẦN THỰC HÀNH 3

V Í D Ụ 1: 3

A: Code Chương Trình 3

B: Kết Quả Demo 4

V Í D Ụ 2: 4

A: Code Chương Trình 4

B: Kết Quả Demo 7

B PHẦN BÀI TẬP 7

* U NNAME IPE P : 7

Vấn đề 1: 7

A: Code Chương Trình: 7

Vấn đề 2: 9

A: Code Chương Trình: 9

B: Kết Quả Demo: 11

* N AME IPE P : 12

Vấn đề 1: 12

A: Code Chương Trình: 12

Vấn đề 2: 14

A: Code Chương Trình: 14

B: Kết Quả Demo: 16

C KẾT LUẬN 17

Trang 3

A PH N TH C HÀNH Ầ Ự

Ví D 1:ụ

A: Code Chươ ng Trình

// vd1.c

#include <stdio.h>

#include <unistd.h>

#include <string.h>

int main(int argc, char* argv[])

{

char result[100];

int fp[2], pid;

if (argc < 2)

{

printf("Doi so thieu\n");

return -1;

}

if (pipe(fp) == 0)

{

pid = fork();

if (pid < 0)

{

printf("Fork failed\n");

return -1;

}

else if (pid == 0)

{

printf("Data from child: %s\n", argv[1]); close(fp[0]);

write(fp[1], argv[1], strlen(argv[1])); }

else

{

Trang 4

close(fp[1]);

read(fp[0], result, strlen(argv[1])); printf("Read from child: %s\n", result); }

}

else

{

printf("Pipe failed\n");

return -2;

}

}

B: K t Qu Demoế ả

Ví D 2:ụ

A: Code Chươ ng Trình

//vd2.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/errno.h>

#include <sys/wait.h>

#define FIFO1 "/tmp/ff.1"

#define FIFO2 "/tmp/ff.2"

#define PM 0666

#define PIPE_BUF 4096

extern int errno;

Trang 5

int main(int argc, char* argv[])

{

char s1[PIPE_BUF], s2[PIPE_BUF], buf[PIPE_BUF];

int childpid, readfd, writefd;

if ((mknod(FIFO1, S_IFIFO | PM, 0) < 0) && (errno != EEXIST)) {

printf("Fail to create FIFO 1 Aborted.\n");

return -1;

}

if ((mknod(FIFO2, S_IFIFO | PM, 0) < 0) && (errno != EEXIST)) {

unlink(FIFO1);

printf("Fail to create FIFO 2 Aborted.\n");

return -1;

}

childpid = fork();

if (childpid == 0)

{

if ((readfd = open(FIFO1, 0)) < 0)

{

perror("Child cannot open read FIFO.\n");

}

if ((writefd = open(FIFO2, 1)) < 0)

{

perror("Child cannot open write FIFO.\n");

}

read(readfd, s2, PIPE_BUF);

printf("Child read from parent: %s\n", s2);

printf("Enter response: ");

fgets(s1, PIPE_BUF, stdin);

write(writefd, s1, strlen(s1));

Trang 6

close(readfd);

close(writefd);

return 1;

}

else if (childpid > 0)

{

if ((writefd = open(FIFO1, 1)) < 0) {

perror("Parent cannot open write FIFO.\n"); }

if ((readfd = open(FIFO2, 0)) < 0) {

perror("Parent cannot open read FIFO.\n"); }

printf("Enter data to FIFO1 from Parent: "); fgets(s1, PIPE_BUF, stdin);

write(writefd, s1, strlen(s1));

read(readfd, s2, PIPE_BUF);

printf("Parent read from child: %s\n", s2); while (wait((int*)0) != childpid);

close(readfd);

close(writefd);

if (unlink(FIFO1) < 0)

{

perror("Cannot remove FIFO1.\n"); }

if (unlink(FIFO2) < 0)

{

perror("Cannot remove FIFO2.\n"); }

return 1;

}

Trang 7

else

{

printf("Fork failed.\n");

return -1;

}

}

B: K t Qu Demoế ả

B PH N BÀI T P Ầ Ậ

* Unname Pipe:

Vấn đề 1: Quá trình cha truyền đối số đầu tiên từ argv [1] là một số nguyên lớn hơn 3 đối với quá trình con thông qua Pipe Tiến trình con nhận, tính giai thừa n! = 1*2*…* n và ghi nó vào đường ống Quá trình cha mẹ nhận và xuất dữ liệu ra màn hình

Vấn đề 2: Tiến trình cha đọc hai số nguyên và một phép toán +, -, *, / và chuyển tất cả cho tiến trình con Tiến trình con tính toán kết quả và trả về kết quả cho tiến trình cha Tiến trình cha ghi kết quả vào một tập tin

V nấ đ 1:ề

A: Code Chươ ng Trình:

//Unnamed_Pipe/bai1.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

Trang 8

int main(int argc, char* argv[]) {

int pipe_fd[2];

pid_t child_pid;

if (argc != 2) {

printf("Usage: %s <number>\n", argv[0]);

exit(1);

}

int num = atoi(argv[1]);

if (pipe(pipe_fd) == -1) {

perror("pipe");

exit(1);

}

if ((child_pid = fork()) == -1) {

perror("fork");

exit(1);

}

if (child_pid == 0) { // Tiến trình con

close(pipe_fd[1]); // Đóng đầu ghi

int result = 1;

for (int i = 2; i <= num; i++) {

result *= i;

}

close(pipe_fd[0]);

printf("Child process: Factorial of %d is %d\n", num, result); } else { // Tiến trình cha

close(pipe_fd[0]); // Đóng đầu đọc

write(pipe_fd[1], &num, sizeof(num));

close(pipe_fd[1]);

wait(NULL);

}

return 0;

Trang 9

B: K t Qu Demo:ế ả

V nấ đ 2:ề

A: Code Chươ ng Trình:

//Unnamed_Pipe/bai2.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main() {

int pipefd[2];

if (pipe(pipefd) == -1) {

perror("pipe");

exit(EXIT_FAILURE);

}

pid_t child_pid = fork();

if (child_pid == -1) {

perror("fork");

exit(EXIT_FAILURE);

}

if (child_pid == 0) {

Trang 10

// Tiến trình con

close(pipefd[1]); // Đóng phần ghi của ống int num1, num2;

char op;

read(pipefd[0], &num1, sizeof(int)); read(pipefd[0], &num2, sizeof(int)); read(pipefd[0], &op, sizeof(char)); int result;

switch (op) {

case '+':

result = num1 + num2;

break;

case '-':

result = num1 - num2;

break;

case '*':

result = num1 * num2;

break;

case '/':

if (num2 != 0) {

result = num1 / num2;

} else {

perror("Chia cho số 0");

exit(EXIT_FAILURE);

}

break;

default:

perror("Toán tử không hợp lệ"); exit(EXIT_FAILURE);

}

close(pipefd[0]); // Đóng phần đọc của ống // In kết quả ra màn hình

Trang 11

printf("Kết quả: %d\n", result);

exit(EXIT_SUCCESS);

} else {

// Tiến trình cha

close(pipefd[0]); // Đóng phần đọc của ống

int num1, num2;

char op;

printf("Nhập hai số nguyên và một toán tử (+, -, *, /): ");

scanf("%d %d %c", &num1, &num2, &op);

// Gửi dữ liệu đến tiến trình con thông qua ống

write(pipefd[1], &num1, sizeof(int));

write(pipefd[1], &num2, sizeof(int));

write(pipefd[1], &op, sizeof(char));

close(pipefd[1]); // Đóng phần ghi của ống

// Chờ tiến trình con hoàn thành

int status;

wait(&status);

}

return 0;

}

B: K t Qu Demo:ế ả

Trang 12

* Name Pipe:

Vấn đề 1: Quá trình cha truyền đối số đầu tiên từ argv [1] là một số nguyên lớn hơn 3 đối với quá trình con thông qua Pipe Tiến trình con nhận, tính giai thừa n! = 1*2*…* n và ghi nó vào đường ống Quá trình cha mẹ nhận và xuất dữ liệu ra màn hình

Vấn đề 2: Tiến trình cha đọc hai số nguyên và một phép toán +, -, *, / và chuyển tất cả cho tiến trình con Tiến trình con tính toán kết quả và trả về kết quả cho tiến trình cha Tiến trình cha ghi kết quả vào một tập tin

V nấ đ 1:ề

A: Code Chươ ng Trình:

//Named_Pipe/bai1.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/wait.h> // Include sys/wait.h for the wait function

#define FIFO_FILE "myfifo"

int main(int argc, char* argv[]) {

int pipe_fd[2];

pid_t child_pid;

if (argc != 2) {

printf("Usage: %s <number>\n", argv[0]);

exit(1);

}

int num = atoi(argv[1]);

mkfifo(FIFO_FILE, 0666);

Trang 13

if ((child_pid = fork()) == -1) {

perror("fork");

exit(1);

}

if (child_pid == 0) { // Tiến trình con

int fd = open(FIFO_FILE, O_RDONLY);

int received_num;

read(fd, &received_num, sizeof(received_num));

close(fd);

int result = 1;

for (int i = 2; i <= received_num; i++) {

result *= i;

}

printf("Child process: Factorial of %d is %d\n", received_num, result); } else { // Tiến trình cha

int fd = open(FIFO_FILE, O_WRONLY);

write(fd, &num, sizeof(num));

close(fd);

wait(NULL);

}

return 0;

}

B: K t Qu Demo:ế ả

Trang 14

V nấ đ 2:ề

A: Code Chươ ng Trình:

//Named_Pipe/bai2.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/wait.h> // Include sys/wait.h for the wait function

#define FIFO_FILE "myfifo"

int main() {

mkfifo(FIFO_FILE, 0666);

pid_t child_pid = fork();

if (child_pid == -1) {

perror("fork");

exit(EXIT_FAILURE);

}

if (child_pid == 0) {

// Tiến trình con

int fd = open(FIFO_FILE, O_RDONLY);

int num1, num2;

char op;

read(fd, &num1, sizeof(int));

read(fd, &num2, sizeof(int));

read(fd, &op, sizeof(char)); // Fix this line

close(fd);

int result;

switch (op) {

Trang 15

case '+':

result = num1 + num2;

break;

case '-':

result = num1 - num2;

break;

case '*':

result = num1 * num2;

break;

case '/':

if (num2 != 0) {

result = num1 / num2;

} else {

perror("Chia cho số 0");

exit(EXIT_FAILURE);

}

break;

default:

perror("Toán tử không hợp lệ");

exit(EXIT_FAILURE);

}

// In kết quả ra màn hình

printf("Kết quả: %d\n", result);

exit(EXIT_SUCCESS);

} else {

// Tiến trình cha

int fd = open(FIFO_FILE, O_WRONLY);

int num1, num2;

char op;

printf("Nhập hai số nguyên và một toán tử (+, -, *, /): "); scanf("%d %d %c", &num1, &num2, &op);

// Gửi dữ liệu đến tiến trình con qua Named Pipe

Trang 16

write(fd, &num1, sizeof(int));

write(fd, &num2, sizeof(int));

write(fd, &op, sizeof(char));

close(fd);

// Chờ tiến trình con hoàn thành

int status;

wait(&status);

}

return 0;

}

B: K t Qu Demo:ế ả

Trang 17

C K T LU N Ế Ậ

Sau khi học và hoàn thành phần lab 6 nhóm thu được kết sau:

Unnamed Pipe (Pipe không tên):

Unnamed Pipe là một cách hiệu quả để truyền dữ liệu giữa các tiến trình cha và con hoặc giữa các tiến trình ngang hàng.

Chúng ta sử dụng hàm pipe để tạo pipe và fork để tạo tiến trình con.

Tiến trình cha sử dụng write để gửi dữ liệu và tiến trình con sử dụng read để đọc dữ liệu.

Pipe thường được sử dụng cho truyền dữ liệu nhanh chóng giữa các tiến trình có mối quan hệ gần.

Named Pipe (Pipe có tên):

Named Pipe (hoặc FIFO) là một tệp đặc biệt trên hệ thống tệp Linux được sử dụng để truyền dữ liệu giữa các tiến trình không liên quan.

Chúng ta sử dụng mkfifo để tạo Named Pipe.

Named Pipe cho phép truyền dữ liệu giữa các tiến trình không có mối quan hệ cha con hoặc không có chung bộ nhớ.

Named Pipe thường được sử dụng cho truyền dữ liệu giữa các tiến trình độc lập.

Phải quản lý đúng các thao tác ghi và đọc:

Trong cả Unnamed Pipe và Named Pipe, quản lý đúng thứ tự các thao tác ghi và đọc là rất quan trọng Tiến trình ghi trước và tiến trình đọc sau đó.

Unnamed Pipe chỉ cho phép truyền dữ liệu một chiều, trong khi Named Pipe cho phép truyền hai chiều (hoặc cả hai đầu có thể sử dụng ghi và đọc).

Sử dụng Named Pipe với tệp đặc biệt:

Sử dụng Named Pipe đòi hỏi tạo và quản lý một tệp đặc biệt trên hệ thống tệp Nó là một cách tiếp cận linh hoạt để truyền dữ liệu giữa các tiến trình.

Xóa Named Pipe sau khi sử dụng:

Khi bạn đã hoàn thành việc sử dụng Named Pipe, hãy chắc chắn xóa nó khỏi hệ thống bằng cách sử dụng lệnh unlink Không xóa Named Pipe có thể gây ra sự lãng phí tài nguyên và lỗi trong tương lai.

Sử dụng Pipe cho truyền dữ liệu nhanh chóng:

Cả Unnamed Pipe và Named Pipe có thể được sử dụng để truyền dữ liệu giữa các tiến trình một cách nhanh chóng và hiệu quả, giúp tối ưu hóa việc trao đổi thông tin trong

hệ thống.

Ngày đăng: 08/05/2024, 16:24

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w