Linux có tên là socket thế nào


38

Tôi biết rằng có các ổ cắm có tên & ống có tên (fifo) trong Linux.

Trong đó ls -l, chúng sẽ trông như dưới đây: (Tôi đã thay đổi tên tệp, để trình diễn.)

prw-r--r-- 1 root root 0 Nov  8 16:31 /tmp/fifo
srwxrwxrwx 1 root root 0 Nov  8 15:54 /tmp/socket

Bây giờ, một đường ống có tên có thể được tạo ra bằng cách sử dụng mkfifo. Có một lệnh để tạo ra một ổ cắm có tên?

Tùy chọn cuối cùng sẽ là viết chương trình C, gọi hàm mknod, nhưng muốn biết, nếu đã có lệnh cho điều đó.

Những gì tôi đã thử:
Tôi đã cố gắng tìm kiếm bất kỳ tùy chọn nào cho mknod & mkfifo, nhưng không thể tìm thấy.

LƯU Ý: Tôi không thảo luận về mô hình máy chủ-máy khách qua Ethernet / mạng. Tệp ổ cắm có tên sẽ được sử dụng bởi 2 quy trình trên cùng một hệ thống.


2
Chỉ cần một lưu ý: Tôi có 2 quy trình - qemu & virsh, có thể nói chuyện với nhau bằng cách sử dụng ổ cắm có tên (theo hiểu biết của tôi dựa trên tài liệu) Nhưng tôi không biết cách tạo ổ cắm có tên. Mặc dù có các tùy chọn khác để sử dụng virsh với qemu, tôi đã tìm kiếm một tùy chọn, trong đó tôi có thể đính kèm virsh vào một quy trình qemu hiện có và nó cần một ổ cắm có tên , trong khi bắt đầu quá trình qemu. Được đặt tên fifo không hoạt động. Thêm vào đó, tôi nghĩ, sẽ rất thú vị khi biết cách tạo ổ cắm có tên, trong trường hợp cần thiết sau này.
anishsane

Câu trả lời:


24

Một tệp ổ cắm Unix / Linux về cơ bản là một bộ hai chiều. Do các socket ban đầu được tạo ra như một cách để quản lý truyền thông mạng, nên có thể thao tác chúng bằng cách sử dụng các cuộc gọi send()recv()hệ thống. Tuy nhiên, trong tinh thần Unix của mọi thứ, mọi thứ đều là một tập tin, bạn cũng có thể sử dụng write()read(). Bạn cần sử dụng socketpair()hoặc socket()để tạo ra các ổ cắm có tên. Hướng dẫn sử dụng socket trong C có thể tìm thấy ở đây: Hướng dẫn của Beej về Unix IPC: Unix Sockets .

Các socattiện ích dòng lệnh rất hữu ích khi bạn muốn chơi xung quanh với ổ cắm mà không cần viết một chương trình "thực". Nó tương tự netcatvà hoạt động như một bộ chuyển đổi giữa các giao diện mạng và tệp khác nhau.

Liên kết:


1
socket Pair () hoặc socket () tạo ra một socket không được đặt tên, chúng sẽ chỉ hữu ích trong chương trình C.
anishsane

Sẽ rất thú vị khi kiểm tra, nếu có thể tạo ra một ổ cắm có tên bằng cách sử dụng socat. Có lẽ, tạo một ổ cắm không tên, liên kết nó với localhost: some_port và sau đó sử dụng socat với cổng đó?
anishsane

3
Có thể tạo các ổ cắm có tên bằng cách sử dụng socatlệnh UNIX-LISTEN, xem man socathoặc hướng dẫn sử dụng HTML này
Joakim Nohlgård

1
Tôi đã thử lệnh nhanh & bẩn này và nó đã tạo ra một tệp socket f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor

1
Nó bị chôn vùi trong các chi tiết của trang web socat, nhưng trong trường hợp nó hữu ích, có một cú pháp để coi hai ống có tên đơn hướng (fifo) là một đơn vị hai chiều có thể được bắc cầu đến các thực thể hai chiều khác như ổ cắm Unix hoặc TCP. Bạn tham gia các ống có tên với !!(socat 1.x) hoặc %(socat 2.x), với chữ viết có tên ống ở bên trái và đọc tên ống ở bên phải. ví dụsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X

17

Tạo một ổ cắm nhanh chóng trong python:

~]# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/somesocket')"
~]# ll /tmp/somesocket 
srwxr-xr-x. 1 root root 0 Mar  3 19:30 /tmp/somesocket

Hoặc với một chương trình C nhỏ , ví dụ: lưu các mục sau vào create-a-socket.c:

#include <fcntl.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    // The following line expects the socket path to be first argument
    char * mysocketpath = argv[1];
    // Alternatively, you could comment that and set it statically:
    //char * mysocketpath = "/tmp/mysock";
    struct sockaddr_un namesock;
    int fd;
    namesock.sun_family = AF_UNIX;
    strncpy(namesock.sun_path, (char *)mysocketpath, sizeof(namesock.sun_path));
    fd = socket(AF_UNIX, SOCK_DGRAM, 0);
    bind(fd, (struct sockaddr *) &namesock, sizeof(struct sockaddr_un));
    close(fd);
    return 0;
}

Sau đó cài đặt gcc, biên dịch nó và ta-da:

~]# gcc -o create-a-socket create-a-socket.c
~]# ./create-a-socket mysock
~]# ll mysock
srwxr-xr-x. 1 root root 0 Mar  3 17:45 mysock

1

Không có công cụ dòng commANGE để tạo ổ cắm vì ổ cắm luôn được kết nối với máy chủ xử lý các yêu cầu được gửi đến ổ cắm đó.

Vì vậy, bạn sẽ phải viết một máy chủ và để điều đó tạo ra ổ cắm. Đây là một hướng dẫn .


Đó vẫn sẽ là một ổ cắm không tên. Tôi muốn tạo ra một ổ cắm, được sử dụng bởi 2 quy trình khác, dưới dạng fifo hai chiều.
anishsane

Kiểm tra các liên kết trong câu trả lời của tôi. Nó cho thấy cách cấu hình bind()để kết nối với"/home/beej/mysocket"
Aaron Digulla
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.