1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đề tài lập trình đa tiến trình xây dựng chương trình chatting trên mạng linux

53 604 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đ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

Định dạng
Số trang 53
Dung lượng 6,02 MB

Nội dung

Luận văn, khóa luận tốt nghiệp, báo cáo là sản phẩm kiến thức, là công trình khoa học đầu tay của sinh viên, đúc kết những kiến thức của cả quá trình nghiên cứu và học tập một chuyên đề, chuyên ngành cụ thể. Tổng hợp các đồ án, khóa luận, tiểu luận, chuyên đề và luận văn tốt nghiệp đại học về các chuyên ngành: Kinh tế, Tài Chính Ngân Hàng, Công nghệ thông tin, Khoa học kỹ thuật, Khoa học xã hội, Y dược, Nông Lâm Ngữ... dành cho sinh viên tham khảo. Kho đề tài hay và mới lạ giúp sinh viên chuyên ngành định hướng và lựa chọn cho mình một đề tài phù hợp, thực hiện viết báo cáo luận văn và bảo vệ thành công đồ án của mình.

Trang 1

ĐẠI HỌC ĐĂ NẴNG TRƯỞNG ĐẠI HỌC KỸ THUẬT

KHOA CONG NGHE THONG TIN - ĐIỆN TỬ VIỄN THONG @ 0 (511) 841 287 - 892 992 E-mail: cnttdhdn@dng.vnn.vn ĐỒ ÂN TỐT NGHIỆP ĐỀ TĂI : LẬP TRÌNH ĐA TIỀN TRÌNH XĐY DỰNG CHƯƠNG TRÌNH

CHATTING TRÍN MANG LINUX

SINH VIÍN THỰC HIỆN :LÍ ANH TRUNG

GIÂO VIÍN HƯỚNG DẪN :NGUYỄN TẤN

Trang 2

ĐĂ NẴNG - 2000

Trang 3

Loi cam on

Trước hết, tôi xin chđn thănh cảm ơn câc thay, câc cô Khoa công nghệ thông tin-điện tử viễn thông cùng toăn thể câc thấy cô trưởng Đại học kỹ thuật Đả Nẵng, những người đê trao cho tôi nhiều kiến thức quý bâu để tôi có được ngăy hôm nay

Xin chđn thănh cắm ơn thđy Nguyễn Tấn Khôi đê trực tiếp hướng dẫn tận tình trong thời gian lăm đồ ân tốt nghiệp Thđy đê định hướng vă từng bước theo

dõi tôi trong qúa trình thực hiện đồ ân năy

Xin được gửi lời cảm ơn đến bạn bỉ, những người đê giúp đỡ, động viín tôi

trong thời gian học tập vă thời gian thực hiện đồ ân tốt nghiệp nói riíng

Cuối cùng, xin bảy tổ lòng biết ơn cha mẹ, những người thđn đê nuôi nắng,

dạy dỗ để tôi có được ngăy hôm nay

Xin được cẩm ơn

Da Nang, ngay 31 thâng 5 năm 2000

Trang 4

TOM TAT NOI DUNG BO AN

Đồ ân năy bao gồm năm chương Nội dung trình băy mỗi chương được

tóm tắt như sau:

-_ Chương I: Giới thiệu tổng quan về để tăi Gidi thiệu hiện trạng sử

dụng hệ điều hănh Linux, khổ năng giao tiếp giữa câc mây qua mạng

Linux va dat vấn đẻ cần giải quyết của dĩ tai

-_ Chương II: Trình băy câc co sĩ ly thuyết có liín quan đến đổ ân như

ngôn ngữ C, ngôn ngữ tcl/tk vă khả năng xđy dựng ứng dụng mạng

- _ Chương III: Xđy dựng hệ thống chatting bao gồm chương trình server

bằng ngôn ngữ C sử dụng đa tiến trình vă chương trình client bằng ngôn ngữ tcl/tk trín X Window Đặt vấn để giao tiếp giưac hai

chương trình

- _ Chương IV: Thử nghiệm chương trình trín câc mây sử dụng Linux

-_ Chương V: Kết luận Níu câc vấn dĩ đê đạt được trín lý thuyết, tính

khả thi vă hương phât triển để tăi

Trang 5

MUC LUC MỤC LỤC 255cc 2211212211111511212711 1122100 1201 1.2 E111 1ecaee 7 "c0 162/100 4 ÒỎ 9 I HỆ ĐIỀU HĂNHLINUX we

II GIAO TIẾP GIỮA CÂC MÂY CÓ SỬ DỤNG HỆ ĐIỀU HĂNH LJINUX . 5- 2 s55scsc£ 9 II.1.Giới thiệu một số tiện ích giao tiếp qua mang Linux a) Lệnh gọi hệ thống talk b) Lệnh gọi hệ thống mail II GIỚI THIỆU NỘI DUNG ĐỀ TĂI 2-2 52212529259 1E15E1215252112121111111111111111111 xe 10 CƠ SỞ LÝ THUYẾT 1 IL NGÔN NGỮ C 1.1 Giới thiệu sơ lược LL Lập trình C trĩn Linux

1.1.2 Một chương trình C dơn giản

1.1.3 Biín dịch vă thực hiện chương trình

I.2.Quấn lý đa tiến trình bằng ngôn ngữ C -: 2 2¿+2++2z++2Sxvcxverrrsrrerree 14 1.2.1 Tiến trình vă da tiến trình .14 a) Khâi niệm tiến trìn trình Câc dấu hiệu nhận biết tiến trìnl b) Trạng thâi của câc Tạo ra một tiến trình Chấm dút một tiến trình ai poe › 1.3 Trao đổi thông tin giữa câc tiền trình 1.3.1 Liín lạc bằng câc tín hiệ a) Khâi niệm b) Một số tín hiệu thường gặ c) Liín lạc bằng câc tín hiệu đ) Một số giới hạn khi sử dụng tín hiệ 13.2 Liín lạc bằng ống dẫn a) Khâi niệm b) Câc đặc diểm của ống dẫn

c) Khởi tạo vă liín lạc bằng ống dai 2I

1.3.3 Trao đổi thông tin giữa câc tiến trình bang a) Khâi niệm

b) Khdi tao dêy thông bâo c) Gổi thông tin lín dêy thông bâo

đ) Nhận thông tin tử dêy thông bâo

1.4 Giao tiếp mạng

Khai niĩm socket va port 28

Tạo ra một socket 29

Chờ đợi một kết n 31 Thực hiện kết nối đến server (client) .32

Ví dụ mẫu mô hình client/servei 32 a) Mê lệnh chương trình server .32

b) Mê lệnh chương trình client .34

NGON NGU TCL/TK

Trang 6

ILII Khâniệm 35 TL.1.2 Câc thănh phần cơ bản của tcl/tk 36 a) Cấu trúc lệnh 36 b) Biến vă giâ trị của biến 36 c) Câc cấu trúc lặp 37 d) Chương trình con 38 1I.2 Một chương trình đơn giản bằng tcl/tk 11.2.1 Cấu trúc chương trình 11.2.2 Thực hiện chương trình 1.3 Sử dụng socket trong tcl/tk „ 40 XĐY DỰNG MƠ HÌNH CLIENT/SER VER -2- 22-522 22S22EES2EEEEEEEECEEECrrrerrrerrrer 4I

I XAY DUNG CHUONG TRÌNH SEVER IL 1.1 Nguyín tắc hoạt động

1.2 Sơ đổ thuật toân thanh phancho dgi kết nối

1.2.1 Khdi tao socket

1.2.2 Khổi tạo dêy thông bâo

1.2.3 Đợi một kết nối từ client

1.3 Sơ đồ thuật toân thănh phần xử lý thông tin trao đổi

1.3.1 Phđn tích tham số đầu văo

1.3.2 Khdi tao socket va tim kiĩm day

1.3.3 Đợi một kết nối từ client 1.3.4 Thực hiện trao đổi thông tin

1.4 Cấu trúc đữ liệu

1.5 Cổng giao tiếp v "

1.6 Quản lý trao đổi thơng tỉn ©-2+2Et2EE2EE2EE2712EE1221711 2121 eEeerre

CHƯƠNG TRÌNH CLIENT II.1 Nguyín tắc hoạt động

11.2 Sơ để thuật toân

II.3 Thiết lập kết nối đến chương trình serVer - 2: 2:©++22++2++zz+zz+srs+z 50 11.4 Phan loại thông tin nhận được từ mây chủ -¿ :- 5+ szcvsxczvsrvsrsrxrr 51

CHUONG IV HGÝŸỶỞ 52

THU NGHIEM CHUONG TRINH .cccccscsssssssssssssssssssssssssseeseesssesusnsnsosssesseeseeesesees 52

I TRINH TU SU DUNG CHUONG TRINHL c.esccccssecsssscsesesesesecssscsssessescsesesseseessescscseeseseees 52 II KẾT QUÂ KẾT LUẬN 222222222222222221111121570222 2 111111 I KẾT QUÂ ĐẠT ĐƯỢC I.1.Chương trình servei " I0 ải) 00.1 33

1.3 Tinh kha thi

Il HAN cHe

III HUONG PHAT TRIEN DE TAI

TAI LIEU THAM KHẢO 22222222222222222221222211221 2 0.1 e 55

Trang 7

CHUONG 1

TONG QUAN DE TAI

I Hĩ diĩu hanh Linux

Hĩ diĩu hanh Linux bat dau phât triển từ năm 1991 Tâc giả ban đầu của hệ diều

hănh nảy lă một sinh viín trường đại học tổng hợp Helsinki, Linus B Torvalds

Linux lă từ viết tắt của Linus (tín tâc giả) vă Unix Phiín bản dầu tiín của Linux gọi

lă phiín bản 0.01 được phât hănh văo thâng 8 nim 1991

Hiện nay, tại phòng thực hănh số 1 trường đại học kỹ thuật Đă Nẵng có căi đặt hệ điều hănh Linux để câc sinh viín chuyín ngănh Tin học cũng như câc ngănh khâc có thể tiếp cận vă học hỏi trín hệ điều hănh năy Ngoăi ra, hệ điều hănh Linux đê dược

đưa văo chương trình học của sinh viín chuyín ngănh thănh một môn bắt buộc Điều năy sẽ giúp cho sinh viín có được câi nhìn tổng quât hơn về hệ điều hănh, có điều

kiện đânh gía vă so sânh với hệ điều hănh dang được sử dụng phổ biến MS DOS vă Microsoft Windows

Đưa hệ điều hănh Linux văo giẳng dạy vă nghiín cứu sẽ mổ ra thím một hướng

đi mới cho sinh viín chuyín ngănh Cuộc chiến thị phần giữa câc hệ diều hănh có di đến kết cuộc như thế năo thì việc biết thím một hệ điều hănh, lập trình được trín đó sẽ lăm vững tin hơn cho câc sinh viín sau khi tốt nghiệp

Về phía sinh viín, Microsoft Windows lă hệ điều hănh rất thđn thiện với người

sử dụng vă tử lđu nay đê được sử dụng rất nhiều Microsoft Windows có khả năng nối mạng cùng chung hệ điều hănh rất để dăng Vậy đối với Linux thì sao? Khi đê có dược hệ thống mạng dùng Linux thì việc giao tiếp giữa câc mây Linux với nhau có gì khâc với hệ điều hănh Microsoft Windows

Il Giao tiếp giữa câc mây có sử dụng hệ điều hănh Linux

Hệ điều hănh Linux được thừa kế Unix nín có rất nhiều tính năng mạnh về mạng mây tính vă giao tiếp giữa câc mây trong mạng, thậm chí chúng dược cụ thể hóa

bằng câc lệnh gọi hệ thống, hay nói ngắn gọn hơn: chỉ lă câc thao tâc đơn giản Với

Trang 8

câc lệnh gọi hệ thống năy có thể dược dùng để trao đổi một số thông tin đơn giản giữa câc user hay giữa hai mây với nhau như lệnh talk, mail, write,

IH.1 - Giới thiệu một số tiện ích giao tiếp qua mạng Linux

a) Lệnh gọi hệ thong talk

Lệnh gọi hệ thống talk cho phĩp hai user đang đăng nhập có thể trao đổi thông tin trực tiếp với nhau Lệnh talk được gọi với tham số lă một user khâc đang tổn tại trong hệ thống Sau đó, măn hình hệ thống dược chia lăm hai phđn, phần dưới dănh

hiễn thị câc dỏng thông bâo của user dối thoại vă phđn trín dănh cho người dang sử dụng Nếu user chưa đăng nhập, talk sẽ thông bâo lỗi về việc user không tổn tại vă trỏ lại dấu nhắc của shell

Một khi sử dụng lệnh gọi hệ thống talk, tất cả những gì chúng ta gõ văo đều được

hiĩn thj 6 user kia Tuy nhiín chúng ta không thể lăm gì khâc cho đến khi thoât khỏi talk Một điều quan trong 1a talk chi cho phĩp hai trao đổi giữa hai user

b)_ Lệnh gọi hệ thống mail

Lệnh mail cho phĩp chúng ta gổi câc đoạn nhắn đến câc user trín mây tính hoặc

câc user trín mạng nếu chúng ta biết tín miễn của user đó So với talk, sử dụng mail

linh hoạt hơn nhưng thông tin trao đổi không mang tính tức thời Chúng ta có thể

kiểm tra mail vă trả lời bất kỳ khi năo chúng ta muốn dẫn đến thông tin sĩ không cập

nhật kịp thời Khó khăn lón nhất của mail lă chúng la luôn phải nhó chính xâc tín user vă tín miễn của dích đến

II Giới thiệu nội dung để tăi

Linux lă hệ điều hănh đa nhiệm, đa người sử dụng, Một người bất kỳ cũng có

thể hiểu được câc khâi niệm trín một khi họ đê đọc lướt qua một quyển sâch, một tỏ

bâo năo đó có nói đến Linux hay Unix chẳng hạn Vậy chúng ta phải nhắc đến điều gì trong khi đó lă những đặc trưng của Linux ?

Đối với một sinh viín chuyín ngănh tin học chúng ta không thể đânh giâ vấn để theo hướng ” Nố /3 ø? ?”mă phải biết nhan xĩt "No lam việc như thế nảo ?”vă quan trọng hơn có thể la "Lam thĩ nảo để sử dụng nớ như công cụ của mình ?" Tù đó

chúng ta thử quay lại với câc khâi niệm trín với một số vấn đề đặt ra:

Trang 9

- Linux quan lý hệ thống bằng câch quản lý câc tiến trình Nếu chung ta có một

chương trình có sỈỈ dụng đa tiến trình thì chúng ta sẽ quản lý chúng như thế

nao?

- Linux da cung cĩp một số lệnh gọi hệ thống cho phĩp truyền thông (có hạn

chế) trín mạng liệu có hỗ trợ cho chúng ta lập trình trín mạng dể dăng hay không?

Nói tóm lại, vấn để đặt ra ổ đđy không phải lă chúng ta sử dụng Linux mă lă chúng ta tận dụng câc đặc trưng của hệ điều hănh để ứng dụng chúng văo việc lập trình trín hệ điều hănh năy

Từ những hạn chế của một số lệnh kể trín, câc tính năng của một hệ đa tiến trình

tôi đê nảy ra ý tưởng xđy dựng một chương trình cho phĩp câc mây sử dụng Linux

(có thể cả MS Windows) có thể giao tiếp với nhau cùng một lúc, qua đó câc sinh

viín có thể sử dụng mây để trao đổi trực tiếp câc thông tin tức thời cho nhau Ngoăi ra có thím một chương trình để tham khảo khi bắt dầu lập trình trín Linux vă X

Window ciing tốt

Tôi đê dựa theo ý tưởng năy để dưa ra quyết định chọn dĩ tai "LAP TRINH DA

TIẾN TRÌNH XĐY DỰNG CHƯƠNG TRÌNH CHATTING TRÍN MẠNG LINUX" lăm dĩ tăi tốt nghiệp của mình Mô hình chatting gồm có hai chương trình, một chương trình phục vụ (server) vă một chương trình khâch (client)

+ Chương trình server lă một chương trình được viết bằng ngôn ngữ C sử dụng da

tiến trình, trao đổi thông tin giữa câc tiến trình vă giao tiếp với câc chương trình client qua mạng Chương trình server có hai thănh phần chính, một thănh phần luôn chở đợi câc kết nối của câc chương trình client từ mây trạm vă một thănh phần tạo ra một tiến trình mới mỗi khi có một client kết nối đến Tiến trình mới năy trực tiếp trao đổi thông tin với chương trình client vừa kết nối

+ Chương trình client được xđy dựng bằng ngôn ngữ tcl/tk, một ngôn ngữ thông

dịch, tạo giao diện với người sử dụng trín X Window Chương trình nảy sử dụng câc giao tiếp qua mạng để truyền vă nhận thông tin với câc chương trình client khâc qua

chương trình server

Trang 10

CHUONG II CƠ SỞ LÝ THUYẾT I NgônngữC L1 Giới thiệu sơ lược 1.1.1 Lâũp trẹnh C trên Linux

C lă một ngôn ngữ được phât triển tử những ngăy dầu của hệ diều hănh Unix C

bắt đầu được hình thănh bổi Dennis Ritchie vdi du ân phât triển Unix Phiín bản đầu

tiín của Unix dược viết bằng hợp ngữ vă một ngôn ngữ gọi lă ngôn ngữ B C dược

phât triển thông qua sự khắc phục những thiếu sót của ngôn ngữ B Kể tử đó C trỏ

thănh một ngôn ngữ dược sử dụng rộng rêi trín thế giới Tại sao C lại lă ngôn ngữ được hỗ trợ rộng rêi trín thế giới? Có một số lý do để C đạt được diều đó:

- C lang6n ngữ rất linh hoạt Hầu như bất kỳ mây tính năo cũng có ít nhất một

bộ biín dịch C phù hợp với nó Cú phâp ngôn ngữ vă câc hăm thư viện được

chuẫn hóa không phụ thuộc hệ thống phần cúng Đđy lă đặc điểm nổi bật lôi cuốn câc nhă phât triển

-_ Thực thi một chương trình viết bằng C khâ nhanh

- _ C lă ngôn ngữ hệ thống với tất câ câc phiĩn ban Unix vă câc hệ biến đổi từ Unix như Linux,

Cuối thập ký 1980, viện tiíu chuẫn quốc gia Hoa Kỳ đê công bố một tiíu chuẫn

cho ngôn ngữ C gọi lă ANSI C

1.1.2 Xây dzông chađng trẹnh C đôn giain

Cấu trúc của một chương trình C được viết để thực hiện trín hệ không có những khâc biệt so với ANSI C Trong ngôn ngữ C, tất câ câc thủ tục được tao ra dĩu theo

khuôn mẫu của hăm Một hăm của C lă một thủ tục hoăn chỉnh nhận câc thông số

truyền đến, thực hiện câc lệnh trong thđn của hăm rôi trả về một kết quả đê được xử

Một chương trình C đơn giản chúng ta sắp xĩt đến chỉ lă chương trình cho xuất ra

thiết bị ra chuẩn một dòng *Helio every body !!“ Chương trình năy chỉ thực hiện

Trang 11

một lệnh in ra măn hình Tuy nhiín để chương trình có thể được thực hiện hoăn

chỉnh, chương trình phải được kết nối đến một thư viện chuẫn thông qua việc liín kết vdi tĩp header la “stdio.h” #include <stdio.h> main () { printf (“ Hello every body !!\n”); }

Đối với Linux, khi một chương trình C liín kết đến câc tệp header (câc tập tin có

phần mỏ rộng lă h) đó sẽ được tìm trong thư mục /us+z/inc1ude Trong thư mục năy chứa tất câ câc tệp header chuẫn vă mỏ rộng

Để có được một chương trình don giản trín, chúng ta có thể dùng bất cứ một chương trình soạn thảo năo chúng ta có được như vi, emacs, Sau đó chúng ta

ghi lại trín một tệp văn bản có phần đuôi lă c vă chuẫn bị cho việc biín dịch chương

trình năy

1.1.3 Bian dĩch vai thetic hiêôn cheang tr¢nh

Biín dịch một chương trình C lă một công việc không có gì lăm khó khăn Trước

hết chúng ta phải xâc định được chương trình cần biín dịnh được chứa trong tập tin

năo vă đưởng dẫn đến tập tin đó Sau đó ta dùng trình biín dịch gcc để biín dịch chương trình C đó

gcc la trình biín dịch C được xem lă một trong những trình biín dịch mạnh nhất của bộ công cụ GNU Ngoăi việc tạo nín tính hiệu quâ về tộc độ, gcc cũng hỗ trợ tất cả câc tiíu chuẫn lập trình C, chẳng hạn như ANSI C, Chúng ta thực hiện biín dịch bằng gcc theo cú phâp như sau:

gcc -o output input

Nếu chương trình không có lỗi về tử vựng hay cú phâp thì chương trình gcc sẽ tạo ra một tập tin thực hiện được có tín lă "output”

Tiếp theo chúng ta sẽ thực hiện chương trình C đê được biín dịch bằng câch gọi đến tập tin "output" như sau:

./output

Trang 12

Lưu ý, ổ đđy chúng ta phải dùng / để xâc định cho hệ vỏ (shell) của Linux biết tập tin nay dang 6 thư mục hiện hănh Nếu không có những ký tự năy chúng ta chỉ nhận dược một thông bâo lỗi *command not £found” Tuy nhiín chúng ta có thể

chỉ dường dẫn đến tập tin năy một câch cụ thể như */home/pro/output“ chẳng

hạn Câch năy thường dược dùng khi chúng ta thực hiện một chương trình không ở

thư mục hiện hănh

Ngoăi tham số -o vừa níu trín, chương trình gcc còn có rất nhiều tham số dănh cho người sử dụng tùy chọn khi biín dịch một chương trình nguồn:

~§: Ngừng sau khi tạo ra mê hợp ngữ ~c: Ngừng sau khi tạo ra mê đối tượng -g: Chỉn câc ký hiệu để hỗ trợ gỏ rối

Vă rất nhiều tham số khâc mă chúng ta có thể tham khâo thím qua câc sâch viết về GNU

1.2 Quản lý đa tiến trình bằng ngôn ngữ C

1.2.1 Tiến trẹnh và da tiến trẹnh

a)_ Khâi niệm tiến trình

Một câch đơn giản nhất để dịnh nghĩa một tiến trình lă chương trình đang thực

hiện Chương trình được tiến hănh theo phương phâp tuần tự: luôn có một lệnh đơn đang thực hiện trong tiến trình tại một thời điểm Chương trình vă tiến trình lă những

khâi niệm khâc nhau, một chương trình không phải lă một tiến trình Một chương

trình lă một thực thể bị động, chương trình chỉ lă một tập tin chứa trín thiết bị lưu trữ thông tin Trong khi tiến trình lă một thực thể động, một tiến trình có một bộ đếm chương trình xâc định lệnh thực hiện kế tiếp, câc giâ trị thanh ghi, ngăn xếp chứa câc dữ liệu tạm thời vă câc tăi nguyín kết hợp

Đối với Linux, tất cả những gì đang thực hiện trín hệ thống đều lă những tiến

trình Bao gím cả những tiến trình do người sử dụng kính hoạt hay những tiến trình

thực hiện ở chế độ nền của hệ điều hănh Khi một người sử dụng đăng nhập văo hệ thống cũng có nghĩa họ đê tạo ra một tiến trình vă tiến trình năy sẽ quản lý câc hoạt

động tiếp theo của người dùng Hay khi một chương trình được thực hiện, thực chất

Trang 13

Trong hệ thống sử dụng Linux, câc tiến trình cùng hoạt động song song hoặc nối tiếp nhau Câc tiến trình luôn ở một trạng thâi nhất dịnh trong những trạng thâi chung được quy định cho câc tiến trình

b)_ Trạng thâi của câc tiến trình

Trạng thâi của mỗi tiến trình được xâc định qua hoạt động hiệ thời của tiến trình đó Một tiến trình có thể lă đang thực hiện, tạm dừng, hay đang ở một trong những trạng thâi khâc Câc trạng thâi cửa một tiến trình có thể lă những trạng thâi sau:

- in execution: tiến trcnh đang đ&ỗc thœôc hiêôn

- Ready: tiến trẹnh đang đảũi đến leatit khi coi matt tidtn tr¢nh khaic dang thefic hidfn

- Suppended: tidtin trenh Aang chai taii nguya&n hay dang

chảì đôũi mỗũt thao tác vảïii các thiết bẻ

- Stopped: tiến trẹnh đai bề treo bảii môũt tiến trẹcnh

khaic

- Zombie: tiadtGn trenh dai katt thuic nheng hêô thống vẫn tham chiếu đến noi, vẫn trao tài nguyên và xem nhœ tiến tr¢nh naiy dang coin hoafit đôũng

1.2.2 Ca1c dấu hiêũu nhâũn biết tiến trcnh

Trong hệ thống Linux, mỗi tiến trình có một dấu hiệu nhận biết đơn nhất gọi lă pid pid lă một số nguyín Khi một tiến trình được tạo ra hệ thống sẽ trao cho nó một giâ trị xâc dinh vă hệ thống nhận biết vă điều khiển câc tiến trình thông qua dấu hiệu

nhận biết năy Cũng như đối với người sử dụng, câc tiến trình có thể nằm trong một

nhóm Vì thế việc quản lý câc tiến trình trong cùng một nhóm trổ nín đơn giản lă

quản lý theo nhóm Dấu hiệu của nhóm tiến trình gọi lă gpid, giâ trị năy lă dấu hiệu nhận biết của tiến trình trưởng nhóm

Một số hăm ngôn ngữ C cho phĩp một tiến trình nhận lấy câc dấu hiệu nhận biết

Trang 14

getpid() có giâ trị trả về lă dấu hiệu nhận biết của tiến trình hiện tại

getppid () trả về dấu hiệu nhận biết của tiến trình cha đê tạo ra tiến trình hiện tại getuid() trả về dấu hiệu của người sử dụng của tiến trình hiện hănh Như vậy, trong lúc thực hiện chương trình, chúng ta có thể dựa văo câc dấu hiệu nhận biết của

câc tiến trình đê được tạo ra để quản lý câc hoạt động của chúng

1.2.3 Taôo ra môêũt tiến trẹnh

Tiến trình hiện hănh có tạo ra một tiến trình con nhờ sử dụng lệnh gọi hệ thống

fork Một khi lệnh năy được thực hiện có nghĩa lă một tiến trình sẽ được tạo ra vă nó

đwọc gọi lă tiến trình con của tiến trình hiện hănh hay tiến trình hiện hănh lă tiến

trình cha của tiến trình mới được tạo ra Đối với ngôn ngữ C ta sử dụng hăm sau:

#include <unsitd.h> pid t fork (void);

Giâ trị trả về khi hăm £ork() được gọi lă -1 nĩu hĩ thĩng da hĩt tăi nguyín vă không thể tạo thím một tiến trình mới Giâ trị 0 sẽ được gởi đến tiến trình mới tạo ra vă dấu hiệu nhận biết của tiến trình mới sẽ được gới đến cho tiến trình đê tạo ra nó

Nguyín tắc cơ bản của lệnh năy lă cho phĩp một tiến trình được tạo ra Khi năy tiến trình cha vă tiến trình con sẽ chó chung doạn mê, doạn dữ liệu của tiến trình con lă một bản sao chính xâc từng bộ phận tương ứng của tiến trình cha Tuy nhiín thănh phan dữ liệu hệ thống có một số thănh phần khâc nhau như pid, thời gian xd ly,

1.2.4 Chấm đaœ1t mdtit tidun tr¢nh

Một chương trình được thực hiện khi kết thúc chương trình đồng nghĩa với tiến

trình gắn với chương trình năy sẽ tự động kết thúc vă hệ thống sẽ lấy lại câc tăi nguyín đê cấp cho tiến trình Cụ thể hơn, một chương trình viết bằng ngôn C sẽ kết

thuc tự động khi kết thúc hăm main Tuy nhiín chúng ta vẫn được cung cấp lệnh cho phĩp ngừng chương trình một câch đột ngột

#include <unsitd.h>

void exit(int status)z

Lệnh exit gđy ngừng tiến trình hiện hănh Tham số status xâc định một giâ trị trả về trong phạm vi tử 0 đến 255 Giâ trị trả về lă 0 trong trường hợp kết thúc bình

thường vă khâc không trong trường hợp kết thúc do lỗi

Trang 15

Nĩu tiĩn trinh cĩ bao gĩm cdc tiến trình con, câc tiến trình con sẽ được gắn với

tiền trình init có dấu hiệu nhận diện lă 1 Tín hiệu SIGCHLD dược gỏi dến tiền trình

cha để bâo rằng có một tiến trình con của nó đê kết thúc Câc tín hiệu sẽ được nhắc

đến trong phần sau

1.3 Trao đổi thông tin giữa câc tiến trình

Trao đổi thông tin giữa câc tiến trình lă trọng tđm của dĩ tai năy Chúng ta sẽ xđy dựng một chương trình server bao gồm nhiễu tiến trình song song

1.3.1 Liên laũc bằng các tín hiêũu

a) Khâi niệm

Khi một tiến trình phản ứng lại những sự kiện không bình thường do chính tiến trình hay của câc tiến trình khâc gđy ra trong môi trưởng hoạt động của tiến trình (lỗi về bộ nhớ, lổi thao tâc câc thiết bị văo ra .) Tín hiệu thường được tạo ra khi một tiến trình gặp một số trường hợp sau:

- _ Kết quả của việc tiến trình gặp vấn dĩ khi tiến trình sử dụng tăi nguyín hệ

thống Nếu tiến trình truy cập (ghi hoặc đọc) đến một vùng nhó không được

cấp phât có nghĩa lă một truy cập không hợp lệ đến một trang bộ nhớ Khi đó một tín hiệu SIGSEGV sẽ được kernel gởi đến tiến trình

- Khi người dùng sử dụng tổ hợp phím [Ctrl - C] một tín hiệu SIGINT dược gởi dến tiến trình vă hănh động mặc định cho tín hiệu năy lă kết thúc tiến trình

nhận tín hiệu

-_ Một tiến trình gởi tín hiệu đến một hay nhiễu tiến trình khâc

Bằng câch gỏi câc tín hiệu cho nhau chúng ta có thể thực hiện được việc trao đổi thông tin giữa câc tiến trình

Khi tiến trình nhận được một tín hiệu (trừ SIGKILL) hoạt động tiếp theo của tiến

trình có thể theo một trong ba hướng sau:

- Tin hiĩu có thể bị bỏ qua Tiến trình vẫn tiếp tục hoạt động bình thường cho

dù câc tín hiệu năy được gói đến

- _ Tiến trình có thể chuyển việc thực hiện tiến trình về một hoạt động do người sử dụng quy định sau đó trổ lại nơi tiến trình đê bị ngắt

Trang 16

- Tiến trình có thể kết thúc sau khi nhận được tín hiệu hoặc việc thực hiện bị lỗi

Mỗi tín tiệu thường được gân cho một hoạt động mặc định (có thể lă không lăm gì cả) Câc hoạt động mặc định năy có thể dược thay đổi bởi tiến trình nhận Như

vậy cùng một tín hiệu nhận được nhưng với những tiến trình khâc nhau thì câc hoạt động tương ứng cũng khâc nhau Tuy nhiín hai tín hiệu không thể sửa đổi lă

SIGKILL va SIGSTOP, hai tin hiệu năy dănh cho người quản lý dùng để ngắt hay

treo câc tiến trình

b)_ Một số tín hiệu thưởng sặp

Dưới dđy lă một số tín hiệu thường gặp trong hệ thống:

- SIGHUP : Tín hiê0u này đœỗc gảii đến các tiến

trẹnh vào lúc cuối khi mà nó tô ngắt Nó cuing đeảùc gảii đến moi tiến trẹnh có tiến trcnh chính

tô ngắt

- SIGINT : Tín hiêôu này đœảùc gảii đến các tiến

trẹcnh khi ta ra lêônh ngắt

- STGQUTT : Teảng tô nhœ trên khi ta goi vào ^D - SIGILL : Lafinh khang hatip 140, tĩn hidfiu 4eaiic gaii

ra khi phát hiêôn 1 lêônh không đúng ải cấp đôủ vâôt lý (ví duô nhœ 1 tiến tr¢nh thc hiêôn môũt lêônh mà máy tính chang coi lêônh này)

- SIGTRAP : Tín hiêôu đœảùc phát ra sau mỗi lêũnh trong traảìng hảủp tiến trẹcnh coi sei dung lêônh

ptrace()

- SIGIOT : Bagy aeatic gaii khi coi caic vatn 446 vad

vatt lyi

- SIGEMT : Bẩy của lêônh gảii, đœỗủc phát ra khi có lỗi vâôũt lý trong khi thzũc hiêôn

- STGFPE : Đmỗc phát ra khi coi lỗi về tính toán

nhœ dấu phẩy đôũng không hảùp lý

- SIGKILL : Trang bẽ để kết thúc tiến trcnh Khang thể bỏ qua hoẵc cắt tín hiêôu này

- SIGBUS Awatic gaii đến khi gẵp lỗi trăn bus

- SIGSEGV Đôảùc gảii đến khi gẵp lỗi trên phân đoaôn: sœô truy câôp dai liêôu ban ngoaii phân đoaôn de? liêôu đœôảùc cấp gảii cho tiến trcnh

- STGSYS : AaGi s&Q khang đúng cho hêñ thống goũi - SIGPIPE : VidUt tran matit ating datn khang mai 4ag

aotic

- SIGTERM : Aeatic gaii ra khi mỗt tiến trenh kaut thuic benh theaing Cuing coi thadg duing aa@ deing 1 hêũ thống để kết thúc tất cả các tiến trcnh

hoaôt đôũng

Trang 17

- SIGUSR1 vai SIGUSR2 : Dainh riêng cho ngeảìi sœí duông

khi lâôp trenh c)_ Liín lạc bằng câc tín hiệu

Chúng ta đê biết về khâi niệm thế năo lă tín hiệu, tín gọi vă hoạt động mặc định của một số tín hiệu thường gặp Nhưng việc liín lạc giữa câc tiến trình phải bao gồm

ít nhất hai tâc vụ chính lă gdi vă nhận tìn hiệu mang thông tin

Thế năo lă một tín hiệu mang thông tin cần thiết đối với câc tiến trình chúng ta

cần mối liín lạc giữa chúng? Tự bản thđn câc tín hiệu không mang câc thông tin cần thiết cho chúng ta mă câc tín hiệu chỉ kích hoạt câc hoạt động tương ứng với nó mă

thôi Vậy việc thay đổi câc hoạt động mặc định cho những tín hiệu có thể vă câch tổ

hợp câc tín hiệu lă một câch dược dùng để truyền thông tin giữa câc tiến trình Sau đđy chúng ta sẽ xem xĩt câc hăm gởi vă xử lý câc tín hiệu:

#include <signal.h>

int (*signal(int sig, int (*fen));

Hăm năy dược dùng để chặn tín hiệu sig va d6i số thú hai có chú năng hướng hoạt động của tiến trình đến một hướng khâc so với hoạt động mặc định của tín hiệu

Đối số thứ hai có thể lă một hăm được người sử dụng thiết kế tương ứng cho tín hiệu đó Đối số thú hai có thể lă một trong ba loại như sau:

- SIG TGN: Hằng chỉ ra rằng tín hiêôu này pjải đôảùc

bỏ qua, tiến trẹcnh vẫn hoaôt đôũng bẹnh thzảìng khi

gẵp tín hiêôu này Hằng này khang coi taic duông

vaii tín hiê0u SIGKILL

- SIG DEL: Hằng thiết lâôp laôi hoaôt đôũng mẵc đẽnh

của tín hiêôu

- Tđn hàm xí lý tín hiêôu

Khi nhận một tín hiệu, hệ thóng ngắt quâ trình thực hiện của tiến trình để thực hiện hăm xứ lý tín hiện Vì thế chúng ta thấy rằng có thể bổ sung hoạt động của một

tiến trình khi có tín hiệu xuất hiện Hay nói câch khâc lă chúng ta có thể thiết lập mối liín lạc giữa câc tiến trình

Việc gổi một tín hiệu được thực hiện bằng hăm sau:

#include <signal.h>

int kill(pid_t pid, int sig);

Trang 18

Đối số thú hai chỉ ra một tin hiệu xâc định sẽ dude gdi Ddi số thứ nhất chỉ ra đối

tượng sẽ nhận tín hiệu năy

- Nếu pid lă một số dương thì tín hiệu sẽ được gởi dến cho tiến trình có dấu

hiệu nhận dang lă pid

- _ Nếu pid lă không thì tín hiệu sẽ được gỏi đến cho tất cả câc tiến trình có cùng

nhóm với tiến trình phât tín hiệu

- Nĩupid bang -1 tin hiệu sẽ được gởi đến tất cả câc tiến trình trừ tiến trình init (tiến trình gốc)

- Nếu pid nhỏ hơn -1 tín hiệu sẽ đueoec gởi đến câc tiến trình thuộc nhóm có

dấu hiệu nhận biết lă giâ trị tuyệt đối của pid

Nếu tín hiệu gổi đi lă không thì không có một tín hiệu năo được gổi, hăm chỉ có tâc dụng kiểm tra tiến trình nhận có tổn tại hay không

Hăm sẽ trả về giâ trị -1 nếu gặp lỗi vă giâ trị 0 nếu hăm kết thúc tốt đẹp

d)_ Một số giối hạn khi sử dụng tín hiệu

Trừ tín hiệu SIGCLD, tất cả câc tín hiệu khi được một tiến trình nhận được đều không dược ghi nhó lại Chúng có thể bị bỏ qua, kết thúc tiến trình hoặc bị chặn lại

cho một hăm xử lý khâc Tuy nhiín mọi thao tâc phải trong tức thời Đó lă lý do đưa

ra để xâc nhận rằng việc dùng câc tín hiệu nhằm mục dích liín lạc giữa câc tiến trình không được thích ứng tốt Một thông điệp dưới dạng tín hiệu có thể bị bỏ qua nếu tiến trình nhận được lúc tín hiệu dang tạm thời bị bỏ qua

Mặt khâc quyền của câc tín hiệu lă khâ lón, khi đến tín hiệu lăm ngắt quảng câc

hoạt động hiện tại của tiến trình Thông thường sẽ không có vấn để xảy ra, nhưng nếu tiến trình đang chở đợi một thao tâc với câc thiết bị, câc tăi nguyín thực hiện

xong thì sẽ gđy ra sự xâo trộn khi tiến trình xử lý xong tín hiệu vă quay trổ lại với công việc trức đó Một điều không được mong muốn trong liín lạc

1.3.2 Liên laôc bằng ống dđẫn a) Khâi niệm

Ống dẫn lă một cơ chế cơ bản để liín lạc giân tiến giữa câc tiến trình Đó lă câc tập tin FIFO đặc biệt (văo trước ra trước), ổ đó thông tin dude truyền văo một hướng

vă được lấy ra 6 một hướng khâc

Trang 19

Tiĩn trinh A ( ) Ồ Tiến trình B

Sơ đỗ mô tả hoạt động của ống dẫn

Tiến trình A vă B phải có mối quan hệ họ hăng b)_ Câc dặc diểm của ống dẫn

- _ Câc ống dẫn liín lạc lă không có tín nín chúng chỉ mang tính chất tạm thỏi Chúng tôn tại trong thời gian thực hiện của tiến trình tạo ra chúng

- _ Việc tạo ra ống dẫn phải dùng một hăm đặc biệt pipe (chúng ta sẽ xĩt đến

phần sau)

- Nhiều tiến trình có thể cùng ghi đọc đồng thời trín một ống dẫn những lại

không có cơ chế phđn biệt câc thông tin ở đầu ra, chúng lă như nhau

- _ Dung lượng ống dên bị hạn chế (văo khoảng 4096 byte) Nếu ta tiếp tục ghi văo một ống dẫn đê đầy sẽ xảy ra hiện tượng tắc nghẽn thông tin trong ống - _ Câc tiến trình liín lạc qua ống dẫn phải có mối quan hệ họ hăng (cha con

.con) vă câc ống dẫn phải được tạo ra trước khi tạo ra một tiến trình con

-_ Không thể tự thay đổi vị trí câc thông tin trong ống

c)_ Khởi tạo vả liín lạc bằng ống dẫn

Để khỏi tạo một ống dẫn ta sử dụng hăm pipe có khai bâo như sau:

int p_inf[2];

int pipe (p_inf);

Ham tra về giâ trị 0 không nếu khởi tạo thănh công, nếu gặp lỗi trả về gid tri -1

Hăm pipe sử dụng một đối số lă một bằng gồm hai thănh phan chính lă p_¡nf[0] va p_inf[1] Hai thănh phần năy chứa bộ mô tả đầu văo hay đầu ra của thông tin cho câc tiến trình sử dụng nó

p_inf[0] : Chufa bộ mô tả dau ra của ống dẫn p_inf[0] : Chứa bộ mô tả dầu văo của ống dẫn

Trang 20

Câc ống dẫn được quản lý thống nhất với hệ thống tập tin Việc truy xuất đến câc ống dẫn được thực hiện bằng câc bộ mô tả văo ra của ống dẫn Câc thao tâc dùng để truy cập thông tin của ống dẫn dược dùng bằng câc hăm nhập xuất chuẫn như read,

write,

Sau khi tạo ra ống dẫn, sử dụng ống dẫn lăm phương tiện truyền thông bằng câch tạo ra câc tiến trình con Khi một tiến trình con được tạo ra, nó được thửa kế cả

những thông tin về câc bộ mô tả văo ra của câc ống dẫn mă tiến trình cha của nó đê

tạo ra Từ đó một tiến trình con có thể sử dụng ống dẫn để truyền thông với tiến trình đê tạo ra nó Điều quan trọng lă thực hiện những thaotâc năy theo thứ tự Do dó để

truyền thông một câch chính xâc, câc tiến trình nín chọn một hướng truyền trín ống dẫn, một tiến trình chỉ đọc vă tiến trình kia chỉ ghi trín ống dẫn Câc bộ mô tả không sử dụng có thể được đóng lại bằng hăm chuẫn close()

Dưới đđy lă một ví dụ cho việc truyền thông giữa hai tiến trình cha vă tiến trình

con thông qua ống dẫn #include <errno.h> #include <stdio.h> void tt_con(int number) { int fd; int nread; char text[100]; £d=number;

printf("Dau hieu mo ta la: %d\n", fd);

Trang 21

OO IOI II ICI III II III IO IO IOI IO I / main () { int fd[2]; if (pipe (fd)== -1) printf ("Loi khoi tao ong dan."); switch (fork()) { case -1: printf ("Loi fork().");7 case 0: tt_con( fd[0] ); } close(fd[0]); if (write(fd[1], "Hello", 6) == -1) printf ("Loi ong dan."); }

Kết quả của chương trình mẫu trín:

Dau hieu mo ta la: 3

Co 6 ky tu tro ong lai: Hello

Qua chương trình ngắn trín chúng ta có thể hiểu được nguyín tắc tạo ra một ống dẫn, kết hợp ống dẫn vói việc tạo ra một tiến trình con vă thực hiện trao đổi thông tin giữa tiến trình cha vătiến trình con © day ching ta chi mdi xem xĩt theo một hướng,

thông tin truyền tử tiến trình cha đến tiến trình con, ngoăi ra chúng ta có thể truyền theo hai hướng trong ống dẫn đê tạo ra bằng câch đọc trong p_inf[0] vă ghi trong

p_inf[1] Để truyền được theo hai hudng độc lập thì việc ghi vă đọc của hai tiến trình phải diễn ra tuần tự

Ví dụ trín bắt đầu tạo một ống dẫn bằng hăm pipe( p_inf ) Sau đó chương trình tiếp tục tạo ra một tiến trình con bằng hăm fork() Lúc năy chúng ta đê có hai tiến trình cha con vă một ống dẫn mă cả hai tiến trình đều có quyền truy cập Tiến trình con sau khi được tạo ra sẽ gọi hăm tt_con( int ), truyền cho hăm bộ mô tả dọc của ống dẫn Hăm tt_con(nt) có nhiệm vụ đọc thông ống dẫn vă in nội dung Tiến trình cha sau khi tạo ra tiến trình con sẽ ghi văo ống dẫn một đoạn thông bâo vă chở đợi tiến trình con kết thúc

Trang 22

So với việc liín lạc giữa câc tiến trình bằng tín hiệu, câc tiến trình đê có thể sử dụng câc ống dẫn để truyền câc thông tin cho nhau một câc để dăng hơn Nhưng đối

với một hệ thống bao gồm nhiều tiến trình hoạt động dộc lập thì tình phức tạp của

câc ống dẫn sẽ không đâp ứng được Mặt khâc câc ống dẫn có giới hạn về dung lượng thông tin vă chỉ những tiến trình có quan hệ "họ hăng" mới có quyín truy cập

đến câc ống dẫn

1.3.3 Trao đổi thăng tin gizwia caic tiến trcnh bằng haa thdung IPC

IPC: Inter Process Comunication (truyền thông đa tiến trình)

a) Khâi niệm

Câc IPC không chỉ cho phĩp trao đổi vă dùng chung dữ liệu mă còn cho phĩp đồng bộ câc tiến trình Câc IPC bắt đầu được sử dụng tử phiín bản System V của

Unix Ngăy nay, câc IPC đê dược sử dụng trín tất câ câc hệ biến đổi của Unix Câc

IPC cho phĩp xử lý tất cả câc kiểu dữ liệu, gởi dự liệu từ tiến trình năy đến tiến trình

khâc hoặc cho phĩp dùng chung dữ liệu Trong thực tế, câc IPC gồm có ba cơ chế: + Câc dêy thông bâo: Một dêy thông bâo có thể được xem như lă một hộp thư Điều năy có nghĩa lă nếu có quyển truy cập cần thiết, một trình ứng dụng có thể gỏi

một thông bâo đến đó (số, một xđu chuỗi, hay thậm chí cả nội dung của một cấu trúc dữ liệu, .) vă câc trình ứng dụng khâc có thể đọc thông bâo năy

+ Bộ nhớ dùng chung: Việc quân lý bộ nhó dùng chung cho phĩp nhiễu trình ứng dụng sử dụng chung một vùng bộ nhó Thông thường khi một vùng bộ nhó được cấp

phât thì nó thuộc văo một tiến trình vă câc tiến trình khâc đang lăm việc trín hệ thống không thể truy cập đến vùng nhó năy Việc quản lý bộ nhó dùng chung cho

phĩp nhiều tiến trình có thể truy cập đín svùng nhó để doc hay ghỉ lí đó

+ Câc dấu hiệu (semaphore): Câc dấu hiệu giúp khắc một trong những khó khăn

lớn nhất đối với một hệ thống đa tiến trình: đó lă sự động bộ hóa tiến trình Thật vậy,

nhiều tiến trình cùng hoạt động văo một thời điểm vă có thể truy cập cùng một dữ liệu Điều năy có thể gđy ra những khó khăn nhất định như truy cập đồng thời văo dữ

liệu, gđy tắc nghẽn

Trong đổ ân năy chúng ta chỉ xĩt câch sử dụng câc dêy thông bâo dể truyền

thông giữa câc tiến trình Một đặc trưng của câc IPC lă mặc dù có sử dụng câc tập tin

Trang 23

nhưng lại không sử dụng hệ thống quản lý tệp Khi một IPC được tạo ra hay xử lý nó không dược sử dụng giống như một tập tin, do đó không sử dụng câc hăm văo ra chuan nhu read, open,

Câc IPC dựa văo một cơ chế quản lý đặc biệt lă quản lý khóa Khóa lă một số nhận dạng cho một IPC ở mức độ hệ thống Do đó để tạo ra hay chỉ để truy cập một

IPC cũng cần phải biết đến khóa của IPC đó

b)_ Khỏi tạo dấy thông bâo

Như đê níu trong phản trín, câc IPC dược quản lý dựa văo một cơ chế đặc biệt lă quả lý khóa Do đó trước tiín chúng ta phải tạo ra khóa cho mỗi IPC trước khi sử dụng đến nó

#include <sys/types.h>

key_t ftok(char *pathname, char prg);

Hăm trả về một nhận dạng cho IPC được tạo ra từ file trong đối số thú nhất Hăm trín dựa văo tổ hợp câc nhận dạng file như số inode file, số thiết bị tạo ra file, kết hợp với tham số thứ hai lă một ký tự để tạo ra một khóa độc nhất cho IPC

Sau khi tạo khóa cho IPC, tử khóa nhận dạng vừa có chúng ta còn định nghĩa

một dêy thông bâo trước khi sử dụng chúng

Câc dêy thông bâo thưởng được so sânh với hệ thống câc hộp thu Diĩu nay cd

nghĩa lă một tiến trình bất kỳ có quyền truy cập dêy thông bâo có thể gổi lín dêy thông bâo câc thông tin của mình cần tryền vă câc tiến trình khâc sẽ truy cập đến dêy thông bâo để nhận lấy thông tin có kiểu mă tiến trình đó cần theo thứ tự đến của thông bâo Hăm khỏi tạo hoặc tìm kiếm một dêy thông bâo được định nghĩa như sau: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>

int msgget(key_t key, int option);

Trang 24

IPC_CREAT | 01000 IPC_EXCL 02000

Nếu đối số thứ hai có giâ trị lă IPC_CREAT thì dêy thông bâo sẽ được tạo ra Nếu đối số có giâ trị khâc sẽ có hai khả năng dược thực hiện:

- _ Nếu khóa chưa được sử dung bdi dêy thông bâo năo thì một dêy thông bâo sẽ

được tạo ra cùng với khóa được truyền IPC_CREAT dược xem lă ngắm dịnh - Nếu khóa dang được sử dụng bởi một dêy thông bâo khâc Lúc năy hoặc IPC_CREAT hoặc IPC_EXCL dược dùng lăm tham số vă tiến trình có thể sử

dụng dêy thông bâo đê có để ghi, đọc câc thông bâo trín dêy

Hăm sẽ trả về dấu hiệu nhận dạng dêy thông bâo để tiến trình sử dụng khi cần

gổi thông tin lín dêy thông bâo hay tìm kiếm thông tin trín đó c) Goi thông tin lín dêy thông bâo

Gdi thông tin lín dêy thông bâo hay gọi lă gổi một thông bâo lín dêy Để gởi

thông bâo lín dêy, chúng ta phải có bộ nhận dạng dêy thông bâo do chúng ta khối

tạo hay sử dụng một dêy thông bâo dê có sẵn tử trước Hăm msgsnd() sau day cho

phĩp gởi một thông bâo đến dêy thông bâo:

#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>

int msgsnd(int msgid, struct msgbuf *msgp, int

msgsize, int msgopt);

Đối số thú nhất lă nhận dạng của dêy thông bâo cần gỏi đến Đối số tiếp theo chính lă thông bâo cần gởi trong cấu trúc của thông bâo gồm có hai thănh phần như

Sau:

struct msgbuf {

long type; /*Kiaou thang baio*/

char *msgtext; /*Caic nati dung thang baio*/

};

Trang 25

dung của thông bâo Chính trưởng kiểu long sẽ quy định kiểu của thông bâo trín

dêy, câc tiến trình sẽ căn cứ văo dđy để lựa chọn câc thông bâo cần thiết

Nếu tùy chọn IPC_NOWAIT dược truyền cho đối số msgopt thì khi dêy thông bâo bị đầy hăm vẫn dược thực hiện nhưng lỗi EAGAIN dược trả về Sau đđy lă danh

sâch câc lỗi có thể gặp phải khi gởi thông bâo: Lỗi Ý nghĩa EAGAIN Không thể gởi thông bâo do dêy đê dđy vă IPC_ WAIT đê xâc lập ENOMEM | Không dủ bộ nhó

d)_ Nhận thông tín từ dđy thông bâo

Hăm cho phĩp nhận một thông bâo tử dêy có kiểu xâc định:

#include <sys/types.h> #include <sys/ipc.h> #include < sys/msg.h>

int msgrcv(int msgid, struct msgbuf *msgp, int

msgsize, long type, int msgflg);

Thông bâo nhđn được chứa trong nội dung bộ nhó do msgp trỏ đến Vùng nhó có

có lớn nhất lă msgsize Hăm năy chỉ nhận lấy thông bâo có kiểu đước xâc định bởi type -_ type =0: Thông bâo thứ nhất của dêy (củ nhất) cho dù thuộc loại năo sẽ được đọc ra - type < 0: Thĩng bao dau tiíu có kiểu nhỏ hơn hoặc bằng trị tuyệt đốicủa type sẽ được đọc

-_ type > 0: Thông bâo dầu tiín có kiểu chính xâc bằng type được đọc ra

Trưởng msgfg có hai giâ trị:

Trang 26

- MSG NOERROR: Nếu kích cổ thông bâo lớn hơn độ rông do trường

msgsize quy định thì thông bâo sẽ bị cắt bót, phần bị cắt sẽ mất đi Nếu không thông bâo sẽ không được dưa ra khỏi dêy, lệnh không thực hiện được

vă trả về lỗi

- IPC_NOWAIT: Cho phĩp tranh tình trạng chờ hoạt động Nếu dêy trống, sẽ có lỗi trả về Nếu không có tùy chọn năy, hăm sẽ chờ đợi cho đến khi có

thông bâo phù hợp yíu cđu

Câc lỗi có thể xảy ra khi nhận thông bâo tii day:

Lỗi Ý nghĩa

EINVAL

Bộ nhận dạng dêy thông bâo không dúng, hoặc msgsize đm hay lón hơn

kích thước dêy quy định

EFAULT Vùng bộ nhó do msgp chỉ đến không

truy cập được

EACCES Tiến trình không đủ quyển truy cập dêy thông bâo

ENOMSG

Tuy chon IPC_NOWAIT da xac lap

va không tìm thấy thông bâo trong

dêy

EINTR

Tiến trình nhận một tín hiệu ngắt khi

đang chỏ một thông bâo

I4 Giao tiếp mạng

1.4.1 Khaii nidim socket vai port

Câc socket được dùng trong lập trình mạng để truy cập vă truyền thông tin Có thể hiểu một câch khâi quât về socket như cơ cấu truy cập file trín Unix được cung

cấp cho một điểm cuối của kết nối Tương tự như việc truy cập file, một ứng dụng có thể yíu cầu hệ thống cung cấp một socket khi nó cần Hệ diều hănh sẽ trả về một số

nguyín mă ứng dụng có thể thông qua đó truy cập đến socket mới được tạo ra theo

yíu cđu

Trang 27

Hau hết câc úng dụng trín mạng sử dụng hai giao thức chính lă: TCP (Transmission Control Protocol) hoặc UDP (User Datagram Protocol) Cac s6 hiệu

cổng dănh cho câc ứng dụng mạng sẽ để dăng cho hệ điều hănh biết được câc ứng dụng sử dụng câc tăi nguyín hệ thống vă câc dịch vụ được phĩp như thĩ nao

Socket lă tổ hợp của hai thănh phần lă địa chỉ IP của mây tính vă số hiệu cổng dược sử dụng bởi phần mềm dùng giao thúc TCP Bởi vì phải có ít nhất hai mây kết

nối truyền thông trín mạng, nín phải có một socket cho cả mây nhận vă mây gỏi

thông tin Địa chỉ IP của mỗi mây lă đơn nhất vă số hiệu cổng lă một số đơn nhất

trín mỗi mây nín socket cũng lă dơn nhất trín mạng Điều năy cho phĩp một ứng dụng trao đổi thông tin với một ứng dụng khâc quan hệ thống mạng một câch trọn

vẹn thông qua socket

Linux hỗ trợ cả hai câch lập trình với socket lă định hướng kết nối (connection

oriented) vă liín lạc không kết nối (connectionless communication) Đối với liín lạc định hướng kết nối, cả server va client phải thiết lập kết nối trước khi truyền di liệu

Đối với liín lạc không kết nối, thì server vă client không cần thiết lập kết nối trước do đó dữ liệu được truyền như một thănh phần của câc thông bâo truyền qua mạng

Tuy nhiín trong cả hai câch trín thì server luôn được khởi động trước, răng buộc nó văo một socket vă chờ đợi một kết nối đến tii client

1.4.2 Taôo ra môũt socket

Để tạo ra một socket, chung ta sti dung ham socket() dude dinh nghĩa như sau: #include<sys/types h>

#include<sys/socket.h>

int socket (int family, int type, int protocol);

Đối với họ Unix, family cd gid tri la PF_UNIX, với họ TCP/IP internet lă

PF_INET, Xerox Corporation PUP internet lă PEF PUP hay với mạng Apple

Computer Incorporated Appletalk lă PF_APPLETALK Tham số type có một trong

hai giâ trị lă SOCK_STREAM dănh cho một kết nối có tin cậy cao nhưng tiốc độ

truyền thông thấp, hoặc lă SOCK_DGRAM có tốc độ truyền thông cao hơn nhưng

độ tin cậy của kết nối thấp hơn Riíng tham số protocol thường được quy định lă

IPPROTO TCP đối với SOCK STREAM vă IPPROTO UDP cho giâ trị

SOCK_DGRAM của tham số thứ hai

Trang 28

Ham tra về giâ trị -I nếu không thể tạo ra một socket Nếu thănh công, giâ tri sĩ

lă bộ mô tả socket Chúng ta sẽ sử dụng bộ mô tâ socket để tham chiếu dĩn socket

vừa tạo ra cho tất câ câc lệnh có sử dụng socket tiếp theo trong chương trình

Khi được khởi tạo, một socket chưa được liín kết với một địa chỉ cục bộ hay địa chỉ đích năo cả Đối với TCP/IP, điều năy có nghĩa lă chưa một cổng giao thức cục bộ năo được gân vă không có một cổng đích hay địa chỉ IP cụ thể Một khi có socket được tạo ra, chương trình server sẽ dùng hăm bind để đặt cho nó một di chỉ cục bộ Hăm bind() được định nghĩa như sau:

#include<sys/types h> #include<sys/socket.h>

int bind(int sockfd, struct sockaddr *saddr, int addrlen)

Tham số đđu tiín lă bộ mô tả socket, tiếp theo lă một cấu trúc chứa địa chỉ cục

bộ vă tham số cuối lă độ lớn của cấu trúc trước đó Cấu tric sockaddr gĩm cdc thănh phần: typedef unsigned char u_char; struct sockaddr{ u_char sa_len; /* Tổng aati daii của đ&a chỉ */ u_char sa_family; /* doing (family) của đ&a chỉ */ char sa data[14]; /* nai dung đ&a chỉ */ Me

Trường sa_/en chi d6 dăi của địa chỉ, trưởng thứ hai sa family chỉ ra địa chỉ

thuộc về một họ giao thức cụ thể (ví dụ như hằng PF_INET đại diện cho TCP/IP) Thđm số cuối cùng chứa câc byte nội dung của địa chỉ

Mỗi họ giao thức đều có định nghĩa một câch chính xâc định dạng của địa chỉ sử

dụng trong trường s4 đ2z⁄2 của cấu trúc sockaddr Ví dụ giao thức TCP/IP sử dụng

Trang 29

struct in_addr sin_addr; /* Aĩa chỉ IP của maiy*/

char sin_zero[8]; /* khang sei duông

*/

Me

Trong cấu trúc trín, hai trường dầu tiín hoăn toăn giống cấu trúc sockaddr, trường thứ ba chứa cổng giao thúc dănh cho ứng dụng, trưởng sin_addr chứa dia chi

IP của mây cục bộ Cấu trúc năy có trường sứ; zcrø/#j/ không dùng đến vì hộ giao thức TCP/IP chỉ cần sâu byte để chứa địa chỉ mây vă cổng cho ứng dụng Như vậy để cấu trúc năy đồng nhất kích thước với cấu trúc sockaddr, cần có thím tâm byte không sử dụng

1.4.3 Chảì đđũi môũt kết nối tà client (server) Sau khi cụ thể một cổng cho socket, chương trình server phải cung cấp cho hệ điều hănh chuyển socket văo chế độ thụ động để có thể chờ đợi một tiếp xúc tử một chương trinh client Chúng ta dùng hăm listen để thực hiện bước năy Hăm listen chỉ

được gọi bởi chương trình server

#include<sys/types.h> #include<sys/socket.h>

int listen(int sockfd, int backlog);

sockfd la b6 mĩ ta socket, backlog lă một số biểu thị thời gian cho đợi một kết nối trước khi loại bỏ Hăm trả về giâ trị nhỏ hơn 1 nếu gặp lỗi Nếu có một kết nối dĩn trong thời gian chờ đợi, lúc năy chúng ta sẽ chuyển sang bước kế tiếp để thực hiện một kết nối đến client

Hăm accept được server sử dụng để nhận lấy bất kỷ thông bâo năo gởi đến tử

hăm connectQ từ chương trình client

#include<sys/types h> #include<sys/socket.h>

int accept(int sockfd, struct sockaddr *peeraddr, int

addrien)

Câc tham số tương tự như hăm bindQ đê xĩt, tuy nhiín øeerzđdr lă một con trở chứa thông tin về mây khâch đê có yíu cầu kết nối

Trang 30

1.4.4 Thzũc hiêôn kết nôếi đến server (client)

Để có được một kết nối đến một server đang ở chế độ chỏ kết nối, thì trước hết

chương trình client phảo tạo ra một sock có câc thănh phần tham số giống như

socket mă server đê răng buộc văo đó Sau đó thực hiện hăm connect() một khi chắc chắn rằng server dang chờ đợi kết nối đến

#include<sys/types h> #include<sys/socket.h>

int connect(int sockfd, struct sockaddr *servsaddr, int addrlen)

Câc tham số tương tự trong hăm bind() Ngoại trừ con trổ servsaddr với cấu trúc

struct sockaddr (thực chất chúng ta dùng struct sockaddr_in ) chứa câc thông tin về chương trình server tại mây chủ như địa chỉ IP, số cổng của giao thức,

Có thể nói ngắn gọn rằng hăm connectQ lă một công cụ để chương trình client tiếp xúc với chuơng trình server, gởi câc thông tin của client dến mây chủ Vă

chương trình server trả lời hănh động tiếp xúc năy bằng hăm accept() vă sau đó kết

nối được thiết lập

Sau khi kết nối được thiết lập, server vă client có thể thực hiện việc trao đổi thông tin cho nhau cho đến khi một trong hai phía đóng kết nối bằng hăm:

close(int socket);

hoặc một trong hai bín bị ngắt đột ngột bỏi hệ thống

1.4.5 Ví duđ mẫu mê hẹnh client/serve+ a) Mê lệnh chương trình server

Trong ví dụ dưới đđy chương trình server thực hiện câc bước thiết lập cho việc

chở đợi một tiếp xúc tử chương trình client Sau khi thiết lập kết nối với client, cả hai thực hiện một số thao tâc truyền vă nhận thông tin rồi kết thúc chương trình

- Tao ra mĩt socket vdi ham socket()

- Rang budc sockket vdi mot dia chỉ bằng hăm bind() -_ Dùng hăm listenQ để chờ đợi một kết nối

- _ Nhận bất kỳ thông tin năo yíu cầu kết nối bằng hăm accept()

Trang 31

- Nhận câc thông bâo gởi đến bằng hăm readQ vă gởi thong bao dĩn client bằng hăm write() #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #include <linux/net.h> #define MY_PORT 6545 main(int argc, char *argv[ ]) { int sockfd, newfd; int cpid;

struct sockaddr_in servaddr; struct sockaddr_in clientInfo;

if ((sockfd = socket (AF_INET,

myabort ("Unable to create socket");

}

bzero((char *) &servaddr, sizeof (servaddr) );

servaddr.sin_ family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_ family = htons(MY_PORT); SOCK_STREAM, < 0) { 1£ (bind(sockfd, (struct sockaddr *) &servaddr, sizeof (struct sockaddr))< 0) { myabort ("Unable to bind socket"); } listen (sockfd, 5); for (77) {

Trang 32

myabort ("Unable to fork on accept");

}

else if (cpid == 0) { /* child */

close (sockfd); /* no need for original */ do_your_thing(newfd); exit (0); } close(newfd); /* in the parent */ }

b) Ma lĩnh chuong trinh client

Từ chương trình client, để thực hiện được một kết nối đến server vă truyền nhận

thông tin chỉ cần thực hiện hai bước cơ bản như sau:

- Tạo một socket tương ứng với chương trình server cụ thể

- _ Yíu cđu đến server thực hiện kết nối bằng câch gọi hăm connect()

Nếu một kết nối được tạo ra, client có thể gổi câc yíu cầu bằng hăng write(Q vă

nhận câc hôi đm trở lại vói hăm readQ

Trong cả hai chương trình năy câc hăm truyền nhận thông tin chưa được thiết kế câc lệnh thănh phần một câch cụ thể, phần năy dănh cho câc bạn lập trình cần tìm hiểu đến #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #include <linux/net.h> #define MY_PORT 6545 #define MY HOST ADDR "204.25.13.1" int getServerSocketId() { int fd, len;

struct sockaddr_in unix_addr;

Trang 33

/* create a Unix domain stream socket */

if ( (fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)

{

return (-1);

}

/* £111 socket address structure w/our address */

memset (&ĩunix_addr, 0, sizeof (unix_addr));

unix_addr.sin_family = AF_INET;

/* convert internet address to binary value*/ unix _addr.sin_addr.s_ addr = inet_addr (MY_HOST_ADDR) ;

unix_addr.sin_ family = htons (MY_PORT);

if (bind(fd, (struct sockaddr *) &unix addr, len) < 0) return (-2);

memset (&ĩunix_addr, 0, sizeof (unix_addr));

if (connect(fd, (struct sockaddr *) Gunix_addr, len) < return (-3); return (fd); } Il Ngônngữtcl/tk IL.1 Khâi nệm II.1.1.Khaii nidtim

tcl (tool command language) lă một ngôn ngữ thông dịch đơn giên của lóp võ

(shell) Linux tk (toolkit) lă bộ công cụ sử dụng cú phâp tcl tạo ra câc giao diện người sử dụng bằng đổ họa (GUI) hợp thănh tử câc thănh phần như câc nút bấm, thanh trượt, hộp thoại, câc cửa sổ, Khi thực hiện một chuong trinh tcl thi tcl shell (tclsh) hoặc windowing shell (wish) sẽ được gọi Cả telsh va wish đều lă những shell

chuẫn của Linux, cả hai đều cho phĩp thực hiện lệnh ở chế độ tương tâc hoặc được

đọc ra từ một tập tin Trong thực tế, chế độ tương tâc trực tiếp hiếm khi được sử dụng vă khả năng của chế độ năy rất hạn chế

Trang 34

Tuy ca telsh va wish đều có thể thực hiện một chương trình tcl, những giữa chúng

có điểm khâc nhau cơ bắn lă telsh chỉ có thể hiểu câc lệnh tcl, trong khi wish có thể hiểu cả câc lệnh tel vă tk II.1.2.Caic thainh phaĩn ca bain cuia tcl/tk a) C&4u tric lĩnh Cấu trúc cơ bản của một lệnh tcl lă: tên1êônh tham số

Tín lệnh lă ký hiệu lệnh của tel để thực thi, tham_ số lă những đối số lựa chọn của cđu lệnh đó Câ hai thănh phần trín được gọi lă lệnh Một lính được kết thực

bằng một ký tự xuống hăng (\n) hay một dẫu chấm phẩy (;) Nếu trín một dỏng chỉ có một lenh thì không cần phải có dấu chấm phẩy

set foo 0; set bar 1

Trín đđy lă hai lệnh minh họa cho ngôn ngữ tcl Hai lệnh trín có tâc dụng như lệnh gân trong C, foo = 0 vă bar = 1

b)_ Biến vả giâ trị của biến

Trong tel cdc biến không dược phđn loại thănh nhiều kiểu như kiểu số nguyín, số thực, kiểu ký tự, Câc biến có thể được gân câc giâ trị lă số, ký tự hay xđu chuỗi

trong câc lần sử dụng khâc nhau trong cùng một chương trình

Đối với tcl, câc biến được xem như câc xau chuỗi Khi biến cần được sử dụng, tel

cho phĩp câc giâ trị số được lấy theo khuôn mẫu chuẫn của ANSI C Câc giâ trị có

Trang 35

tel dinh nghĩa hai loại biến lă biến vô hướng vă mảng Để tạo ra một biến vô

hướng vă gân cho nó một giâ trị ta dùng lệnh set như đê gặp ở phđn trín:

set temp 1;

Lệnh nạo tạo ra biến temp vă gân cho nó giâ trị lă 1 Muốn thay đổi giâ trị của temp thănh một giâ trị khâc ta lại sử dụng lệnh set

set temp "Hello everybody";

Giâ trị ca temp bay giờ lă môt xđu chuỗi, cặp nhây kĩp chỉ cho tcl nhận biết đđy lă một dêy câc ký tự

Ngược với lệnh set, lệnh puts lại có tâc dụng lấy giâ trị của biến vă chuyển đến

thiết bị xuất, trong trườg hợp dưới đđy lă măn hình

puts Sbanana;

Ky tu $ trudc tín biến chỉ ra rang tcl truy cập đến giâ trị của biến theo sau Quy

ước năy cũng giống như việc có thể thay đổi kiểu giâ trị của biến lă những quy ước sử dụng trong câc shell của Unix

e)_ Câc cấu trúc lặp

Ngôn ngữ tcl hỗ trợ ba cấu trúc lặp lă for, foreach vă while Ngoăi ra còn có hai

lệnh điều khiển lặp 1a contunue va break Sau dđy chúng ta củng xem xĩt cú phâp

của từng cấp trúc lặp dó

while {bidgu theic} {lênh thành phần}

Lặp câc lệnh thănh phần cho đến khi biển thức điều kiện nhận giâ tri sai

foreach biến ({ds giai trẻ} (lêônh thành phần}

Lặp câc lệnh thănh phần với tổng số lần lă tống số phần tử trong ds_ giâ trị, tương

ứng mỗi lần lặp biến được nhận một giâ trị trong ds_ giâ trị cho đến hết

for {biến khảíi đầu} {biểu théc} {dk tăng} {lêônh thanh phần}

Lặp câc lệnh thănh phần cho đến khi biến khdi đầu sau một số lần thay đổi giâ trị

Trang 36

puts $x; } Đoạn chương trình trín khởi tạo giâ trị 0 cho x, thực hiện lặp x từ 0 đến 9 va in giâ trị của x ra măn hình foreach element {ocnp li} { switch $element { o- {puts gas;} c- p- li- {puts solid; } }

Đoạn chương trình trín lần lượt thay giâ trị cla element la o, c, p, li để thực hiện lệnh rẽ nhânh swi(ch trong lệnh thănh phđn

Tương tự như cấu trúc lặp while ổ trín, ví dụ của cấu trúc for dưới đđy cũng thực hiện lặp biến x tử 0 đến 9 vă in giâ trị của nó ra măn hình

for {set i 0} {$i <= 10} {incr i} { puts Si; } d) Chuong trinh con

Một thủ tục trong tcl gồm có câc thănh phđn lă tín thủ tục, danh sâch tham số

(nếu có) vă câc lệnh nội dung của thú tục Cú phâp để khai bâo một thủ tục như sau:

proc tadn_tt {tham số} {lêônh thành phần}

Số lượng tham số của một thủ tục lă không bắt buộc, một thủ tục có thể không có một tham số năo Khi năy phần khai bâo tham số sẽ lă {} Ví dụ sau lă một khai bâo thủ tục đơn giản với tín thủ tục, không có tham số vă thănh phđn chỉ lă một lệnh đơn

kiểm tra xem thủ tục có hoạt động tốt hay không Tuy nhiín nếu chỉ như vậy thì thủ

tục trín chỉ mới được khai bâo vă câc lệnh thănh phan thi tục chưa được thực hiện

cho đến khi thủ tục được gọi đến trong chương trình

proc test_proc {} { puts "procedure test"; }

Trang 37

Để gọi thực hiện thủ tục trín ta gọi đến tín thủ tục đó vă truyền thđm số cho thủ tục nếu có Trong ví dụ năy lă một thủ tục không có tham số

test_proc;

Một chương trình đơn giản bằng tcl/tk I1I.1.3.Cấu trúc cheông trợnh

tcl lă ngôn ngữ thông dịch nín câc lệnh của một chương trình được thực hiện tuần tự Câc lệnh tring chương trình được phđn tích vă kết xuất theo thứ tự từ đầu đến

cuối Không như một chương trình C, chương trình tel không có cấu trúc rõ nĩt, cả chương trình lă tập hợp của những lệnh đơn, câc cấu trúc lặp, câc khai bâo thủ tục vă lệnh gọi thực thi câc thủ tục đê khai bâo Tuy nhiín dòng đầu tiín của một tap tin

chứa chương trình tel được bắt đầu như sau: #lusr/bin/wish hoặc : #!/bin/sh # the next line restarts using wish \ exec wish "$0" "$@"

Do sh thường được đặt ở những vị trí khâc nhau đối với từng phiín bản khâc

nhau, do đó khi sử dụng theo dạng thứ hai người sử dụng chỉ cần có wish trong

đường dẫn chỉ ra của họ lă đủ để địch câc chương trình tcl/tk trín hệ thống

II.1.4.Thetiic hiêũn cheang tr¢nh

Thực hiện một chương trình tel/tk ta có thể dùng một trong hai dang sau:

$ tclsh myprog.tcl $ wish myprog.tcl

Tại sao lại có hai dạng khâc nhau để thực hiện một chương trình tcl/tk, chúng có gì khâc nhau? Đặc điểm khâc nhau chính chúng ta đê được biết khi tìm hiểu về telsh vă wish, tuy nhiín vẫn có một số điểm khâc biệt khi thực hiện một chương trình wish mặc dù có thể hiểu được câc lệnh của tel vă cả câc lệnh của tk nhưng wish chỉ

được thực hiện trong môi trường X window

Trang 38

I2 Sti dung socket trong tcl/tk

Lệnh thiết lập một socket kết nối đến server có cú phâp như sau:

socket ?options? host port

Lệnh năy thực hiện kết nối đến server vă trả về số hiệu của socket nếu thănh công Sau khi kết nối, chúng ta có thể đọc vă ghi trín socket bing câc lệnh read, puts

vă flush Lệnh năy chỉ hỗ trợ bởi giao thức TCP, những phiín bản sau của Linux có

thể sẻ hỗ trợ thím câc giao thức khâc

Một diều chắc chắn rằng, trước khi lệnh năy dược thực hiện server phải đê sẵn săng chờ kết nối đến Ví dụ kết nối đến server có địa chỉ lă 192 0 1 2 vă cổng lă 9015:

socket 192 0 1 2 9015;

Trang 39

CHUONG III

XAY DUNG MO HINH CLIENT/SERVER

I Xđy dựng chương trình sever I1 Nguyín tắc hoạt động

Chương trình server được xđy dựng bằng ngôn ngữ C, ứng dụng lập trình da tiền trình trín Linux để tạo ra câc thănh phần chính cho một chương trình server Mục

đíc chình của chương trình server lă tạo ra câc socket vă chờ đợi câc chương trình

client từ câc mây trạm khâc kết nối văo Sau khi có một client (chương trình client) kết nối đến, chương trình server phải tạo ra một cổng mới cho client đó dồng thời

khỏi tạo bộ phận trực tiếp giao tiếp với chính client đó Tiếp đến chương trình server

trổ lại trạng thâi chờ đợi một kết nối từ một client khâc

Như vậy cấu trúc của một chương trình server sẽ có hai thănh phđn chính Một thănh phđn luôn chờ đợi câc kết nối, trao đổi một số thông tin cần thiết vă kích hoạt thănh phđn giao tiếp trực tiếp đến client Một thănh phđn khâc chỉ được kích hoạt khi có một client kết nối đến, thănh phđn năy chịu trâch nhiệm kết nối với client, nhận

câc thông tin từ client để gổi đến câc client khâc nếu có đồng thời nhận thông tin tử câc client khâc đến rồi truyền cho client mă nó quản lý

Khi có n client kết nối đến server, chương trình server sẽ tổn tại n+1 thănh phan, trong đó có n thănh phần trực tiếp truyền thông với câc client vă một thănh phần chờ đợi câc kít nôi mdi ị SERVER TT _ĐỢI Client 1 Doe ị Client 2 Lộ TT_XLÝ : TT_XLY

Sơ đồ hoạt dĩng hĩ client/server

Trang 40

1.2 Sơ đồ thuật todn thanh phanchĩ dgi kết nối BẮT ĐẦU Khdi tao socket Khởi tao day thông bâo Đợi một kết nối tử client Không Có kết nối Có Nhận thông tin tt client Gọi chương trình quản lý client

I.2.1 Khaii tatio socket

Chuong trinh goi ham mk_connect() dĩ tao mĩt socket thống nhất cho tất cả câc

client kĩt nối đến server lần đầu tiín Một client muốn kết nối với thănh phần năy phải sử dụng socket có địa chủ IP của mây chủ vă số hiệu cổng lă 9013 Đoạn chương trình khỏi tao socket của hai thănh phđn tạo nín server hoăn toăn giống nhau

trử số hiệu cổng kết nối Sau day lă đoạn chương trình minh hoa khdi tao socket: int mk_connect (int port)

Ngày đăng: 08/07/2014, 20:05

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w