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 1TRƯỜ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 2B 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 3printf( %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 4write(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 5int 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 6printf("%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 7printf( 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 8return -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 9int 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 10return ;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 112C: 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 12printf( 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 13msgctl(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