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 3

13 0 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ả Nguyễn Ngô Đăng Khoa
Trường học Trường Đại Học Tôn Đức Thắng
Chuyên ngành Khoa Công Nghệ Thông Tin
Thể loại lab report
Năm xuất bản 2022
Định dạng
Số trang 13
Dung lượng 1,86 MB

Nội dung

PHẦN BÀI TẬP...21A: Tiến trình cha chuyển đối số đầu tiên argv [1] là một số nguyên lớn hơn 3 cho tiến trình con thông qua đường ống.. Tiến trình cha nhận và xuất dữ liệu ra màn hình.Sử

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, 2021-2022 Lab 6 Thành Viên: Nguyễn Ngô Đăng Khoa (521H0084)

Mục lục

B PHẦN BÀI TẬP 2

1A: Tiến trình cha chuyển đối số đầu tiên (argv [1]) là một số nguyên lớn hơn 3 cho tiến trình con thông qua đường ống Tiến trình con nhận, tính giá trị n! = 1 * 2 * … * n và ghi nó vào đường ống Tiến trình cha nhận và xuất dữ liệu ra màn hình Sử dụng đường ống vô danh (Unnamed Pipe) 2

1B: Giải lại vấn đề 1A với đường ống có tên (Named Pipe) 3

1C: Giải lại vấn đề 1A với kỹ thuật truyền thông điệp (Message Passing) 4

2A: Tiến trình cha đọc hai số nguyên và một thao tác +, -, *, / và chuyển tất cả cho tiến trình con Quá trình con tính toán kết quả và trả về cho tiến trình cha Quá trình cha mẹ ghi kết quả vào một tệp 6

2B: Giải lại vấn đề 2A với đường ống có tên (Named Pipe) 8

2C: Giải lại vấn đề 1A với kỹ thuật truyền thông điệp (Message Passing) 11

KẾT LUẬN 13

Trang 2

B PHẦN BÀI TẬP

1A: Tiến trình cha chuyển đối số đầu tiên (argv [1]) là một số nguyên lớn hơn 3 cho tiến trình con thông qua đường ống Tiến trình con nhận, tính giá trị n! = 1 * 2 * … * n và ghi nó vào đường ống Tiến trình cha nhận và xuất dữ liệu ra màn hình Sử dụng đường ống vô danh (Unnamed Pipe).

A: Code Chương Trình

#include stdio.h>

#include unistd.h>

#include string.h>

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

{

char result[100];

int fp[2];

int i, n, ketqua = 1;

int pid;

if(argc< ) {

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

close(fp[ ]);0

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

}

else {

close(fp[ ]);1

read(fp[0], result, strlen(argv[ ]));1

n = atoi(result);

for (i ; i = 1 <= n; i ++){

ketqua ketqua i;= *

}

Trang 3

printf( %d! = %d\n", n, ketqua);

}

} // of row 14

else {printf( Pipe failed\n"); return -2;}

}

B: Kết Quả Demo

1B: Giải lại vấn đề 1A với đường ống có tên (Named Pipe) A: Code Chương trình

#include stdio.h>

#include unistd.h>

#include string.h>

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

{

char result[100];

int fp[2];

int pid;

int i, result1 ;= 1

int result2 = 0;

if(argc< ) {

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

close(fp[ ]);0

Trang 4

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

}

else {

close(fp[ ]);1

read(fp[0], result, strlen(argv[ ]));1

result2 = atoi(result);

for (i ; i = 2 <= result2; i++){

result1 result1 i;= *

}

printf( %d! = %d\n",result2, result1);

}

} // of row 14

else {printf( Pipe failed\n"); return -2;}

}

B: Kết Quả Demo

1C: Giải lại vấn đề 1A với kỹ thuật truyền thông điệp (Message Passing)

A: Code Chương trình

#include stdio.h>

#include sys/ipc.h>

#include sys/msg.h>

#include sys/types.h>

#include sys/wait.h>

#include stdlib.h>

#include unistd.h>

struct mesg_buffer

{

long mesg_type;

Trang 5

int mesg;

};

int main(int argc, char ** argv)

{

struct mesg_buffer mess;

key_t key;

int gt ;= 1

int msgid;

key = ftok(" " , 1);

msgid = msgget(key, 0666| IPC_CREAT);

mess.mesg_type = 1;

int n= atoi(argv[ ]);1

if(argc > 2){

printf( Qua nhieu doi so \n");

}

else if(argc < )

{

printf( thieu doi so\n");

}else{

if(n <= ){

printf( Doi so nho hon 3\n");

}else{

pid_t pid;

pid=fork();

if(pid )< 0

{

printf( Fork failed");

}

else if(pid==0){

int i;

for (i= ;i<=n;i++) gt=gt i;*

mess.mesg gt;=

msgsnd(msgid, mess, & sizeof(mess), 0);

}else{

wait(NULL);

msgrcv(msgid, mess, & sizeof(mess), , ); 1 0

Trang 6

printf("%d!=%d\n",n,mess.mesg);

msgctl(msgid, IPC_RMID, NULL);

}

}

}

return ;0

}

B: Kết Quả Demo

2A: Tiến trình cha đọc hai số nguyên và một thao tác +, -, *, /

và chuyển tất cả cho tiến trình con Quá trình con tính toán kết quả và trả về cho tiến trình cha Quá trình cha mẹ ghi kết quả vào một tệp.

A: Code Chương trình

#include<stdio.h>

#include<unistd.h>

#include<string.h>

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

int fp[2];

int pid;

int kq,tt;

if (argc< ){

printf( Doi so khong dung\n");

return -1;

}

if(pipe(fp)==0){

pid=fork();

if(pid < ){

Trang 7

printf( Fork failed\n");

return -1;

}else if(pid ==0){

int pt = *argv[ ];3

int i;

if(pt == ' '+ ){

tt=atoi(argv[ ]) + atoi(argv[ ]); }

else if(pt == ' '){

tt=atoi(argv[ ]) - atoi(argv[ ]); }

else if(pt == ' '){

tt=atoi(argv[ ]) * atoi(argv[ ]); }

else if(pt == ' '){

tt=atoi(argv[ ]) / atoi(argv[ ]); }

else{

tt= ;

}

close(fp[ ]);0

write(fp[ ], tt,1 & sizeof(tt));

}

else{

close(fp[ ]);1

read(fp[ ], kq,0 & sizeof(kq));

//ghi ra file

FILE fp;

fp=fopen("Result2A.txt" "w+"); fprintf(fp,"%s %s %s =

%d\n" argv[ ],1 argv[3],argv[ ],kq);2

fclose(fp);

}

}

else{

printf( Pipe failed\n");

Trang 8

return -2;

}

return ;0

}

B: Kết Quả Demo

2B: Giải lại vấn đề 2A với đường ống có tên (Named Pipe) A: Code Chương trình

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<string.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<sys/errno.h>

#define FIFO1 /tmp/ff.1"

#define FIFO2 /tmp/ff.2"

#define PM 0666

extern int errno;

#define PIPE_BUF 4096

int main( int , char* []){

Trang 9

int kq,tt;

int childpid, readfd, writefd;

if((mknod(FIFO1,S_IFIFO PM,| 0 < )&& (errno!=EEXIST)){ printf( Fail to create FIFO 1.Aborted \n"); return -1;

}

if((mknod(FIFO2,S_IFIFO PM,| 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 < )

perror( child cannot open readFIFO \n");

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

perror( child cannot open writeFIFO \n"); char pt=*argv[ ];3

if(pt == ' '+ ){

tt=atoi(argv[1]) + atoi(argv[ ]);2

}

else if(pt == ' '){

tt=atoi(argv[1]) - atoi(argv[ ]);2

}

else if(pt == ' '){

tt=atoi(argv[1]) * atoi(argv[ ]);2

}

else if(pt == ' '){

tt=atoi(argv[1]) / atoi(argv[ ]);2

}

else{

tt= ;

}

write(writefd, tt,& sizeof(tt));

close(writefd);

close(readfd);

Trang 10

return ;1

}

else if(childpid >0){

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

perror( Parent cannot open writeFIFO \n");

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

perror( Parent cannot open readFIFO \n"); read(readfd, kq,PIPE_BUF);&

FILE *fp;

fp=fopen("Result2B.txt" "w+");

fprintf(fp," %s %s %s = %d\n",argv[ ],argv[ ],argv[ ],kq);1 3 2 while (wait((int* ) 0 !=childpid);

close(writefd);

close(readfd);

if(unlink(FIFO1)<0)

perror( cannot remove FIFO1 \n");

if(unlink(FIFO2)<0)

perror( cannot remove FIFO2 \n");

return ;1

}

else{

printf("Fork failed \n );

return 1

}return ;

}

B: Kết Quả Demo

Trang 11

2C: Giải lại vấn đề 1A với kỹ thuật truyền thông điệp (Message Passing)

A Code chương trình:

#include stdio.h>

#include sys/ipc.h>

#include sys/msg.h>

#include sys/types.h>

#include sys/wait.h>

#include stdlib.h>

#include unistd.h>

#include string.h>

struct mesg_buffer

{

long mesg_type;

int mesg_a,mesg_b;

int mesg_kq;

char mesg[ ]; 1

};

int main(int argc, char ** argv)

{

struct mesg_buffer mess;

key_t key;

int gt ;= 1

int msgid;

key = ftok(" " , 1);

msgid = msgget(key, 0666| IPC_CREAT);

mess.mesg_type = 1;

int n= atoi(argv[ ]);1

if(argc > 4){

Trang 12

printf( Qua nhieu doi so");

}

else if( argv < 4){

printf( Thieu doi so");

}

else{

pid_t pid;

pid= fork();

if(pid < )

{

printf( Fork failed");

}

else if(pid ==0){

sleep( );2

msgrcv(msgid,&mess, sizeof(mess), , );1 0 int a=mess.mesg_a;

int b=mess.mesg_b;

if(strcmp(mess.mesg," "+ )==0) mess.mesg_kq a= +b; else if(strcmp(mess.mesg," ")==0) mess.mesg_kq a= -b; else if(strcmp(mess.mesg," ")==0) mess.mesg_kq a= *b; else

mess.mesg_kq a= /b;

mess.mesg_type = 2;

msgsnd(msgid, mess, & sizeof(mess), );0

}

else{

mess.mesg_type = ;

mess.mesg_a= atoi(argv[ ]);1

mess.mesg_b= atoi(argv[ ]);2

strcpy(mess.mesg,argv[ ]);3

msgsnd(msgid,&mess, sizeof(mess), );0

sleep( );2

msgrcv(msgid,&mess, sizeof(mess), , );2 0

printf( %d %s %d = %d\n",mess.mesg_a, mess.mesg, mess.mesg_b, mess.mesg_kq);

Trang 13

msgctl(msgid, IPC_RMID, NULL ); }

}

return ;0

}

B: Kết Quả Demo

KẾT LUẬN

Hoàn thành được 2/3 bài tập

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

w