Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 15

Họ và tên: Biện Thành Hưng

Lớp: DCT1215 – Nhóm 05 – Thứ 2 – Tiết 9, 10


Mã số sinh viên: 3121410236

Bài làm
Bài
1:
a. 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 message queue. Tiến trình con
nhận, tính giá trị n! = 1 * 2 * ... * n và ghi nó vào message queue. Tiến
trình cha nhận và xuất dữ liệu ra màn hình. Sử dụng message queue
để giải quyết vấn đề.
- Code:
- CMD Ubuntu:
b. Hãy thực hiện 2 tiến trình hoàn toàn riêng biệt, không sử dụng tiến
trình cha con. Giải quyết lại vấn đề trên.
- Code file send:
- Code file receive:
- CMD Ubuntu:

Bài 2:
a. Tiến trình cha đọc hai số nguyên và một thao tác +, -, x, / 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 xuất kết quả. Hãy giải quyết vấn đề trên với kỹ thuật message queue.

- Code:
key ftok( " . " , 1) ;

msgid msgget(key, I CREAT);

message.mesg type 1;

a atoi(argv[lj);

b atoi(argv[2j);

h r c ( h r) rgv [ J ;

if (pid B)

message.data 0;

h(c)

case ' +' :

message.data a + b;

b reaI‹ ;

case ' -' :

message.data a b;

b reaI‹ ;

case 'x':

message.data a b;

b reaI‹ ;

' /':

message.data a / b;

b reaI‹ ;

msgsnd(msgid, 6message, sizeof(message), B);

exit(0);

else

if (pid > B)

wait(NULL);

msgrcv(msgid, 6message, sizeof(message), 1, 0);

printf(“%d %d\n“, a, c, b, message.data);


- CMD Ubuntu:

b. Hãy tách 2 tiến trình trên thành 2 tiến trình hoàn toàn độc lập. Giải quyết lại vấn
đề
trên.

- Code file send:


- Code file receive:
- CMD Ubuntu:
Bài 2: Tạo ra 2 tiến trình P0 và P1. Tiến trình P0 đọc từ file nhiều dãy
số nguyên liên tiếp (mỗi dãy có thể có số phần tử khác nhau). Sau đó
tiến trình P0 lần lượt gửi các dãy sang P1. P1 thực hiện sắp xếp mỗi
dãy theo thứ tự tăng dần, đồng thời tính tổng của dãy đó, sau đó gửi
dãy kết quả và tổng tương ứng về P0. P0 sẽ ghi lại kết quả vào file
sao cho: dãy có tổng nhỏ nhất sẽ được ghi đầu tiên, sau đó các dãy
có tổng lớn hơn lần lượt ghi tiếp theo. Hãy thực hiện bài toán với
message queue.
- Code file send:
struct data messData[1'?];

i 1 e ( c/ sg r c v ( msg id2 , Anne s sage , s i z e o ( mes sage ) ,, s))

messData[k].arrLength - message.mesg data.arrLength;


messData[k].sum - message.mesg_data.sum;

fo’ ( i - P; i < message.mesg data.arrLength; i)

messData[k].arr[i] - message.mesg_data.arr[i];

k;

it (message.done)

*or’ (rui - ‹ ; i < k, i )

o r ( i t j = i +; j < k ; j)

if (messData[i].sum > messData[j].sum)

s »cdata tmp - messData[i];


messData[i] - messData[j]; messData[j] - tmp;

*or’ (wi - '?; ik; in)

*oc (int j - ; j < messData[i].arrLength; j)


- Code file receive:
main()

y key1, key 2 ;

msgidl, msgid2;

key1 ( . , );

ms g i d1 = ( ke y1 , CREAT ) ;

message.mesg type = ;

key 2 ( . , );

ms g i d2 = ( ke y 2, CREAT ) ;

.’ h (r v ( ms g i d1 , Anne s s a ge ,zI ( me s s a ge ) ,, .))

message.mesg data.sum = ’;

r ( n i = .; i message . me sq data . ar r Length ; i )

message.mesg data.sum += message.mesg data.arr[i];

for (in- i = ; i message.mesg data.arrLength j l )

r ( n j = i + ; j message .me sq data . ar r Length ; j )

if (message.mesg data.arr[i] > message.mesg data.arr[j])

tmp = message.mesg data.arr[i];

message.mesg data.arr[i] = message.mesg data.arr[j];

message.mesg data.arr[j] = tmp;

msgsnd(msgid2, Smessage, sizeof(message), ’);


- CMD Ubuntu:

You might also like