Ống được đặt tên là gì?


Câu trả lời:


153

Cả trên hệ thống Windows và POSIX, các đường ống có tên cung cấp một cách để giao tiếp giữa các quá trình xảy ra giữa các quy trình chạy trên cùng một máy. Những gì được đặt tên đường ống cung cấp cho bạn là một cách để gửi dữ liệu của bạn mà không bị phạt hiệu suất liên quan đến ngăn xếp mạng.

Giống như bạn có một máy chủ lắng nghe địa chỉ / cổng IP cho các yêu cầu đến, một máy chủ cũng có thể thiết lập một đường ống có tên có thể lắng nghe các yêu cầu. Trong cả hai trường hợp, quy trình khách (hoặc thư viện truy cập DB) phải biết địa chỉ cụ thể (hoặc tên ống) để gửi yêu cầu. Thông thường, tồn tại một mặc định tiêu chuẩn thường được sử dụng (giống như cổng 80 cho HTTP, máy chủ SQL sử dụng cổng 1433 trong TCP / IP; \. \ Pipe \ sql \ query cho một ống có tên).

Bằng cách thiết lập các đường dẫn có tên bổ sung, bạn có thể có nhiều máy chủ DB đang chạy, mỗi máy chủ có trình lắng nghe yêu cầu riêng.

Ưu điểm của các đường ống được đặt tên là nó thường nhanh hơn nhiều và giải phóng tài nguyên ngăn xếp mạng.

- BTW, trong thế giới Windows, bạn cũng có thể đặt tên đường ống cho các máy từ xa - nhưng trong trường hợp đó, đường ống có tên được vận chuyển qua TCP / IP, do đó bạn sẽ mất hiệu suất. Sử dụng ống có tên cho giao tiếp máy cục bộ.


1
Nhược điểm là gì?
lindhe

2
@lindhe Không có khả năng hoạt động tự động trên mạng. Nói chung khó thiết lập hơn trong thực tế. Việc triển khai khác nhau trong Windows so với các hệ thống giống Unix / Unix. Chúng rất tuyệt, nhưng tôi sẽ không bận tâm trừ khi hiệu suất là phải.
sudo

43

Cả Unix và Windows đều có những thứ gọi là "Các ống được đặt tên", nhưng chúng hoạt động khác nhau. Trên Unix, một đường ống có tên là đường một chiều thường chỉ có một người đọc và một nhà văn - nhà văn viết và người đọc đọc, bạn hiểu không?

Trên Windows, thứ được gọi là "Đường ống được đặt tên" là một đối tượng IPC giống như một ổ cắm TCP - mọi thứ có thể chảy cả hai chiều và có một số siêu dữ liệu (Bạn có thể có được thông tin đăng nhập của vật ở đầu kia, v.v.).

Các ống có tên Unix xuất hiện dưới dạng một tệp đặc biệt trong hệ thống tệp và có thể được truy cập bằng các lệnh IO tệp thông thường bao gồm cả vỏ. Những cái Windows thì không, và cần phải được mở bằng một cuộc gọi hệ thống đặc biệt (sau đó chúng hoạt động giống như một tay cầm win32 bình thường).

Khó hiểu hơn nữa, Unix có một thứ gọi là "ổ cắm Unix" hoặc ổ cắm AF_UNIX, hoạt động giống như (nhưng không hoàn toàn giống như) một "ống có tên" win32, là hai chiều.


23


Cơ chế giao tiếp liên kết đầu tiên của Linux ống đầu tiên (FIFO).

Ống không tên
Trên dòng lệnh, được biểu thị bằng "|" giữa hai lệnh.

Đặt tên ống
Một tập tin đặc biệt của FIFO. Sau khi tạo, bạn có thể sử dụng đường ống giống như một tệp bình thường (mở, đóng, viết, đọc, v.v.).

Để tạo một ống có tên, được gọi là "myPipe", từ dòng lệnh ( trang man ):

mkfifo myPipe  

Để tạo một đường ống được đặt tên từ c, trong đó "pathname" là tên bạn muốn đường ống có và "chế độ" chứa các quyền bạn muốn đường ống có ( trang man ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

2
"Bạn có thể sử dụng đường ống giống như một tập tin bình thường" - không hoàn toàn đúng. Bạn không thể tell()định vị cũng như seek()trong một đường ống.
nyov

19

Theo Wikipedia :

[...] Một đường ống truyền thống là "không tên" bởi vì nó tồn tại ẩn danh và chỉ tồn tại trong chừng nào quá trình đang chạy. Một ống có tên là bền vững hệ thống và tồn tại ngoài vòng đời của quy trình và phải được "hủy liên kết" hoặc xóa sau khi nó không còn được sử dụng. Các quy trình thường gắn vào đường ống có tên (thường xuất hiện dưới dạng tệp) để thực hiện IPC (giao tiếp giữa các quá trình).


12

Đối chiếu

echo "test" | wc

đến

mkdnod apipe p
wc apipe

wc sẽ chặn cho đến khi

echo "test" > apipe

thực thi


7

Ống là một cách truyền dữ liệu giữa các ứng dụng. Trong Linux, tôi sử dụng tất cả thời gian để truyền đầu ra của một quá trình sang một quy trình khác. Đây là ẩn danh vì ứng dụng đích không biết luồng đầu vào đó đến từ đâu. Nó không cần.

Một đường ống có tên chỉ là một cách chủ động móc vào một đường ống hiện có và làm xáo trộn dữ liệu của nó. Đó là cho các tình huống mà nhà cung cấp không biết khách hàng sẽ ăn dữ liệu gì.


6

Đây là một exeprt từ Technet (vì vậy không chắc tại sao câu trả lời được đánh dấu nói rằng các ống có tên nhanh hơn ??):

Ống được đặt tên so với ổ cắm TCP / IP

Trong môi trường mạng cục bộ (LAN) nhanh, các ổ cắm Giao thức điều khiển truyền / Giao thức Internet (TCP / IP) và các máy khách được đặt tên có thể so sánh về hiệu suất. Tuy nhiên, sự khác biệt về hiệu suất giữa các ổ cắm TCP / IP và các máy khách được đặt tên trở nên rõ ràng với các mạng chậm hơn, chẳng hạn như trên các mạng diện rộng (WAN) hoặc mạng quay số. Điều này là do các cách khác nhau mà các cơ chế giao tiếp giữa các quá trình (IPC) giao tiếp giữa các đồng nghiệp.

Đối với các đường ống được đặt tên, thông tin liên lạc mạng thường tương tác nhiều hơn. Một máy ngang hàng không gửi dữ liệu cho đến khi một máy ngang hàng khác yêu cầu sử dụng lệnh đọc. Một mạng đọc thường liên quan đến một loạt các thông báo ống có tên nhìn trộm trước khi nó bắt đầu đọc dữ liệu. Đây có thể là rất tốn kém trong một mạng chậm và gây ra lưu lượng mạng quá mức , từ đó ảnh hưởng đến các máy khách mạng khác.

Nó cũng quan trọng để làm rõ nếu bạn đang nói về đường ống địa phương hoặc đường ống mạng. Nếu ứng dụng máy chủ đang chạy cục bộ trên máy tính đang chạy phiên bản SQL Server, giao thức Named Faucet cục bộ là một tùy chọn. Các đường ống có tên địa phương chạy trong chế độ kernel và rất nhanh.

Đối với Ổ cắm TCP / IP, việc truyền dữ liệu được sắp xếp hợp lý hơn và có ít chi phí hơn. Việc truyền dữ liệu cũng có thể tận dụng các cơ chế nâng cao hiệu suất của TCP / IP Sockets như cửa sổ, xác nhận bị trì hoãn, v.v. Điều này có thể rất hữu ích trong một mạng chậm. Tùy thuộc vào loại ứng dụng, sự khác biệt hiệu suất như vậy có thể là đáng kể.

Ổ cắm TCP / IP cũng hỗ trợ hàng đợi tồn đọng. Điều này có thể cung cấp hiệu ứng làm mịn hạn chế so với các đường ống được đặt tên có thể dẫn đến các lỗi bận đường ống khi bạn đang cố gắng kết nối với SQL Server.

Nói chung, TCP / IP được ưu tiên trong mạng LAN chậm, mạng LAN hoặc mạng quay số, trong khi các đường ống có tên có thể là lựa chọn tốt hơn khi tốc độ mạng không phải là vấn đề, vì nó cung cấp nhiều tùy chọn chức năng, dễ sử dụng và cấu hình hơn.


5

Giao tiếp giữa các quá trình (chủ yếu) cho các ứng dụng Windows. Tương tự như việc sử dụng các socket để giao tiếp giữa các ứng dụng trong Unix.

MSDN


4
Các ống được đặt tên xuất hiện trong phiên bản Unix hoặc AT & T Unix vào khoảng năm 1975.
dmckee --- ex-moderator mèo con

Đừng! Đó là một chút trước Microsoft. Theo như tôi biết thì chúng không được sử dụng thường xuyên trong các ứng dụng Unix / Linux. Thật?
Ken

Tôi sử dụng một ống có tên cho trình tạo chữ ký ngẫu nhiên của mình - vì các ứng dụng mail và usenet mong đợi một tệp có tên $ HOME / .signature có chữ ký của bạn, chương trình của tôi tạo .signature như một ống có tên và viết các trích dẫn ngẫu nhiên cho nó.
Paul Tomblin

3

Các ống được đặt tên trong ngữ cảnh unix / linux có thể được sử dụng để tạo hai shell khác nhau để liên lạc vì shell không thể chia sẻ bất cứ thứ gì với nhau.

Hơn nữa, một tập lệnh khởi tạo hai lần trong cùng một trình bao không thể chia sẻ bất cứ điều gì thông qua hai trường hợp. Tôi đã tìm thấy một cách sử dụng cho các ống được đặt tên khi mã hóa một trình nền có chứa hàm start () và stop () và tôi muốn sử dụng cùng một tập lệnh để thực hiện hai hành động.

Không có ống dẫn được đặt tên (hoặc bất kỳ loại semaphore) bắt đầu tập lệnh trong nền không phải là một vấn đề. Vấn đề là khi nó kết thúc, bạn không thể truy cập vào thể hiện trong nền.

Vì vậy, khi bạn muốn gửi cho anh ta lệnh dừng, bạn không thể: chạy cùng một tập lệnh mà không có tên ống và gọi hàm stop () sẽ không làm gì cả vì bạn thực sự đang chạy một thể hiện khác.

Giải pháp là triển khai hai đường ống, một ĐỌC và VIẾT khác khi bạn khởi động trình nền. Sau đó làm cho anh ta, trong số các nhiệm vụ khác của nó, lắng nghe ống READ. Sau đó, hàm Stop () chứa một lệnh sẽ viết một thông báo trong đường ống, sẽ được xử lý bởi tập lệnh chạy nền sẽ thực hiện thoát 0. Bằng cách này, phiên bản thứ hai của cùng một kịch bản chỉ có nhiệm vụ thực hiện: nói với trường hợp đầu tiên dừng lại.

Bằng cách này, một và chỉ một tập lệnh có thể bắt đầu và dừng chính nó.

Tất nhiên, bạn có nhiều cách khác nhau để làm điều đó bằng cách kích hoạt điểm dừng thông qua một cú chạm chẳng hạn. Nhưng điều này là tốt đẹp và thú vị để mã.


1

Các ống được đặt tên là một hệ thống cửa sổ để liên lạc giữa các quá trình. Trong trường hợp máy chủ SQL, nếu máy chủ ở trên cùng một máy với máy khách, thì có thể sử dụng các đường dẫn có tên để bảo vệ dữ liệu, trái ngược với TCP / IP.


Nó không chỉ dành cho Windows, vì câu trả lời của bạn làm cho nó xuất hiện. Như những người khác đã lưu ý, các đường ống được đặt tên đã có từ những năm 70 trong UNIX, nói chung với sự xuất hiện của một tệp đặc biệt. Dù sao đi nữa, nhưng sửa câu trả lời của bạn.
Chris Charabaruk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.