Tải bản đầy đủ (.pdf) (13 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.86 MB, 13 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN </b>

<b>BÁO CÁO BÀI TẬP NMHĐHHK2, 2021-2022</b>

<b>Lab 6</b>

<b>Thành Viên: Nguyễn Ngô Đăng Khoa (521H0084)</b>

Mục lục

<small>B. PHẦN BÀI TẬP...2</small>

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ả chotiến trình con. Q trình con tính tố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

<small>KẾT LUẬN...13</small>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

B. PHẦN BÀI TẬP

<b>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ếntrì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).</b>

int i, n, ketqua = 1; int pid;

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;= * }

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

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

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

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

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

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

long mesg_type;

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

int mesg; };

int main(int <i>argc</i>, char ** <i>argv</i>){

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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

printf("%d!=%d\n",n,mess.mesg); msgctl(msgid, IPC_RMID, NULL); }

}}

return ;0}

<b>B: Kết Quả Demo</b>

<b>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. Q trình con tính tốn kếtquả và trả về cho tiến trình cha. Quá trình cha mẹ ghi kết quả vào một tệp.</b>

printf( Doi so khong dung\n"); return -1;

if(pipe(fp)==0){ pid=fork(); if(pid < ){

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

printf( Fork failed\n"); return -1;

}else if(pid ==0){ int pt = *<i>argv</i>[ ];3 int i;

} } else{

printf( Pipe failed\n");

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

return -2; }

return ;0}

int main( int , char* []){

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="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((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

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

close(readfd);

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="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);&

printf("Fork failed \n );return 1

}return ;}

<b>B: Kết Quả Demo</b>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

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

long mesg_type; int mesg_a,mesg_b; int mesg_kq; char mesg[ ]; 1};

int main(int <i>argc</i>, char ** <i>argv</i>){

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

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

printf( Qua nhieu doi so"); }

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 }

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

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

msgctl(msgid, IPC_RMID, NULL ); }

return ;0}

<b>B: Kết Quả Demo</b>

KẾT LUẬN

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

</div>

×