Linux adlı yuva nasıl yapılır


37

Linux'ta isimler adında, pipo adının (fifo) olduğunu biliyorum

İçinde ls -l, aşağıdakine bakarlardı: (Gösteri için dosya isimlerini değiştirdim.)

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

Şimdi, adlandırılmış bir boru kullanılarak oluşturulabilir mkfifo. Adlandırılmış bir soket oluşturmak için bir komut var mı?

Son seçenek, mknod işlevini çağıran, ancak bunun için zaten bir komut olup olmadığını bilmek isteyen bir C programı yazmak olacaktır.

Ne denedim:
mknod & mkfifo için herhangi bir seçenek aramaya çalıştım, ancak birini bulamadım.

NOT: Sunucu / istemci modelini Ethernet / ağ üzerinden tartışmıyorum. Belirtilen soket dosyası aynı sistemde 2 işlem tarafından kullanılacaktır.


2
Sadece bir not: 2 işlem var - qemu & virsh, birbirleriyle birbirleriyle konuşabilir (adlandırılmış soketi kullanarak konuşabilirim (belgelere dayanarak benim anlayışıma göre)). QEMU ile virsh kullanmak için başka seçenekler de varken, mevcut qemu işlemine virüsü ekleyebileceğim ve qemu işlemini başlatırken adlandırılmış bir sokete ihtiyaç duyacağım bir seçenek arıyordum . Beşli olarak adlandırılan işe yaramaz. Artı, daha sonra gerekli olması durumunda, adlandırılmış soket oluşturmayı bilmek ilginç olacağını düşünüyorum.
anishsane

Yanıtlar:


23

Bir Unix / Linux soket dosyası temelde iki yönlü bir FIFO'dur. Soketler başlangıçta ağ iletişimini yönetmenin bir yolu olarak oluşturulduğundan, onları send()ve recv()sistem çağrılarını kullanarak değiştirmek mümkündür . Ancak, “her şey bir dosya” nın Unix ruhunda, write()ve de kullanabilirsiniz read(). Adlandırılmış yuvalar oluşturmanız socketpair()veya kullanmanız gerekir socket(). C'deki soketlerin kullanımıyla ilgili bir eğiticiyi burada bulabilirsiniz: Beej'in Unix IPC Kılavuzu: Unix Soketleri .

socatEğer bir "gerçek" programına yazmadan prizleri uğraşmak istediğinizde komut satırı yardımcı yararlıdır. Benzer netcatve farklı ağ ve dosya arayüzleri arasında bir adaptör gibi davranır.

Bağlantılar:


1
socketpair () veya socket (), yalnızca C programının içinden kullanılabilecek, adlandırılmamış bir soket oluşturur.
anishsane

Kullanarak adlandırılmış bir soket oluşturmak mümkün olup olmadığını kontrol etmek ilginç olurdu socat. Muhtemelen, adlandırılmamış bir soket oluşturun, onu localhost'a bağlayın: some_port ve sonra socat'ı o portla mı kullanın?
anishsane

3
socatUNIX-LISTEN komutunu kullanarak adlandırılmış soketler oluşturmak mümkündür , bu HTML kılavuzuna bakınız man socatveya
Joakim Nohlgård

1
Ben bu hızlı ve kirli komutu denedik ve bir soket dosyasını oluşturdu f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor,

1
Socat web sitesinin detaylarına gömüldü, ancak yararlı olması durumunda, iki tek yönlü adlandırılmış boruyu (fifo), Unix veya TCP soketleri gibi diğer iki yönlü varlıklara köprülenebilecek tek yönlü bir ünite olarak ele almak için bir sözdizimi var. !!İsmi geçen borulara (socat 1.x) veya %(socat 2.x), solda pipe isimli yazı ve sağda pipe isimli yazı ile katılıyorsunuz . örneğinsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X

17

Python ile hızlıca bir soket oluşturun:

~]# 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

Veya küçük bir C programında , örneğin aşağıdakileri saklayın 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;
}

Sonra gcc'yi kurun, derleyin ve 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

Bir soket her zaman o sokete gönderilen istekleri yerine getiren bir sunucuya bağlandığından, soketler oluşturmak için bir komut satırı aracı yoktur.

Böylece bir sunucu yazmanız ve soketi oluşturmasına izin vermeniz gerekir. İşte bir öğretici .


Bu hala isimsiz bir soket olurdu. Diğer iki işlem tarafından iki yönlü fifo olarak kullanılacak bir soket oluşturmak istiyorum.
anishsane

Cevabımdaki linki kontrol et. Nasıl bind()bağlanacağınızı gösterir"/home/beej/mysocket"
Aaron Digulla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.