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

17 0 0
Tài liệu đã được kiểm tra trùng lặp
báo cáo bài tập nhập môn hệ điều hành lab 6 1

Đ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

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 6Nhóm: O1 Tổ: 02

Trang 3

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;

}}

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 ((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"); }

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;

}}

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

wait(NULL); }

return 0;

Trang 9

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

switch (op) { case '+':

result = num1 + num2; break;

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;

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

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;

Trang 15

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 {

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