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>
<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>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>
<b>Hoàn thành được 2/3 bài tập</b>
</div>