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 605 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

Tiêu đề Đề 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
Tác giả Lê Anh Trung
Người hướng dẫn Nguyễn Tấn Khôi
Trường học Đại Học Đà Nẵng
Chuyên ngành Kỹ thuật phần mềm / Công nghệ thông tin
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2000
Thành phố Đà Nẵng
Định dạng
Số trang 53
Dung lượng 6,02 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

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

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

LỚP : 95T

Trang 2

ĐÀ NẴNG - 2000

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

Trang 5

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

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

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

NGON NGU TCL/TK

II.1.Khiái niệm cssecssecsvecscssecssesssessecssesesessvessecsuecssessesssesssesssessecssessseeees KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

Trang 6

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

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.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

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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:

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

Trang 10

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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”

Đố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:

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

lă tạo ra một tiến trình với nhiệm vụ của tiến trình năy lă thực thi chương trình đó KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lí Anh Trung

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

đặc trưng có liín quan đến tiến trình:

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lí Anh Trung

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

- _ 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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lí Anh Trung

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 theôc 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

- 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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lí Anh Trung

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

KHOA CONG NGHE THONG TIN - DIEN TU VIEN THONG Lĩ Anh Trung

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lí Anh Trung

Trang 19

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

- 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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

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

switch (nread=read(fd, text, sizeof(text))) {

Trang 21

OO IOI II ICI III II III IO IO IOI IO I /

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lí Anh Trung

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

int msgget(key_t key, int option);

Đối số thứ nhất là khóa của dãy thông báo đã tổn tại hay sắp được tao ra Déi sé thứ hai là sự lựa chọn giữa các hằng trong bảng sau:

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*/

};

Thông thường chúng ta không sử dụng hoàn toàn nguyên mẫu theo cấu trúc này

để truyền các thông tin lên dãy thông báo Tuy nhiên thành phần dầu tiên của cấu trúc thông báo được truyền phải là một trường kiểu long và tiếp sau đó là các nội KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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:

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 > 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ị:

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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:

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

đ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

KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG Lê Anh Trung

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

🧩 Sản phẩm bạn có thể quan tâm

w