「お昼の放送」の思い出

以前リナックスのファイルタイプについてお聞きしました。
今、これらのファイルの作成方法をネットで調べたのですが、ソケットの作成方法だけは調べ切れませんでした。
ソケット以外は次のように調べられました。

普通のファイル:
touchやecho + リダイレクション

ディレクトリー:
mkdir

シンボリックリンク:
ln -s

名前付きパイプ:
mkfifo

キャラクタスペシャルファイル、ブロックスペシャルファイル:
mknod

どのサイトにもこれらの説明は掲載されているのですが、なぜかソケットの作成方法が掲載されていません。
ひょっとしてソケットを作成するコマンドは存在しないのでしょうか。
詳しい方、教えてください。

A 回答 (7件)

>目的はソケットを使用して何かやりたいというわけではなく、


>ただ単に、カレントディレクトリー中にソケットを作成して、それをls -lで見てみたいと思っているのです。

こんにちは。

超手抜きプログラムをつくってみました。
こんな感じでソケット「./mysocket=」が作成されます。
ソースの中で何をやっているかは、ネットで調べればすぐにわかります。

参考にしてください。

# cat mksocket.c

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    struct sockaddr_un addr;
    int fd_socket, rc;

    fd_socket = socket(AF_UNIX, SOCK_STREAM, 0);
    if (fd_socket == -1) {
        perror("socket");
        exit(1);
    }

    if (!access("mysocket", F_OK)) {
        unlink("mysocket");
    }

    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, "mysocket");

    rc = bind(fd_socket, (struct sockaddr *)&addr, sizeof(addr));
    if (rc == -1) {
        perror("bind");
        exit(1);
    }

    exit(0);
}


# ls
./ ../ mksocket* mksocket.c
#
# ./mksocket
#
# ls
./ ../ mksocket* mksocket.c mysocket=
#
    • good
    • 0
この回答へのお礼

xjdさん、ご返信ありがとうございます。
ソケットファイル「mysocket」を作成することができました。
「mysocket=」ではなく「mysocket」でした(コピペミスかな???)
超手抜きプログラムとはいうものの、
C言語の知識がほとんどない私にとっては、このソースを解読するのに相当時間がかかります。
そこで、頂いたソースコードのif文や#includeをはしょって、さらなる超々小型プログラムに作り替えて実行しました。

お礼日時:2006/10/02 01:24

>例えば異なるアプリケーションソフトA-B間のデータ通信を担う専用のDLLがあるとすると、


>このDLLがリナックスのソケットファイルに当たるのかなと思いました。

違います。
DLLは、Dynamic Link Libraryですから、DLLに該当するのはこの場合socket()やbind()というシステムコールです。

ソケットはプロセス間ので通信を行うためのインタフェースの一種で、そのソケットの中にソケット・ファイルというものがあるという事です。
    • good
    • 1
この回答へのお礼

Leanさん、ご返信ありがとうございます。
ソケットファイルというのは、あくまでソケットの一種なのですね。
これを念頭に置き、ソケットについて検索してみました。
ソケットというのは何かの実体ではなく通信をするための1つの方法のことなのですね。
そして、ソケットファイルというのはユニックス中で、このソケットと同様の通信をするためのファイルという理解でどうでしょうか。

以前教わった名前付きパイプも、このソケットファイルと同様にプロセス間通信をするためのファイルということから両者は同じ様な機能を提供する特殊ファイルなのだと思いました。
インターネットをするときフレッツにするか、てぷこにするか選択するような感じでしょうか。

お礼日時:2006/10/03 20:45

>実は、ソケットファイルとは具体的に何をするためのファイルなのか未だに理解できていませんでした。



例えば、あるWEBサイトを見る場合、ブラウザを起動しURLを入力して見ようとしているWEBサイトにアクセスしますよね。

この時ブラウザはWEBサーバからHTMLファイルや画像ファイルといったデータを受け取っています。
逆にWEBサーバから見れば、ブラウザからこのHTMLが欲しい、この画像ファイルが欲しいという要求を受け取っています。

つまり、ブラウザとWEBサーバ間で通信して相互にデータのやりとりをしているのは理解出来ますよね?

この時相互のデータのやりとりに使用されているのがsocketです。
このsocketの中でブラウザ-WEBサーバ間はTCP/IPを使用していますが、ファイルを通してでもデータを相互にやりとりが出来ます。
その時使用されるファイルがソケット・ファイルです。
ただし、ソケット・ファイルはファイルですので同一マシン上のプロセス(プログラム)間でしか使用出来ないというのはあります。

netstatコマンドを実行すると「Active UNIX domain sockets」というような項目がありその下に情報が表示されますが、その情報の一番右にファイル名が表示されているものがあると思いますが、それがソケット・ファイルです。
    • good
    • 0
この回答へのお礼

Leanさん、連続返信ありがとうございます。
今WindowsのDLLを思い浮かべています。
例えば異なるアプリケーションソフトA-B間のデータ通信を担う専用のDLLがあるとすると、
このDLLがリナックスのソケットファイルに当たるのかなと思いました。
アプリケーションソフトAからBを呼び出そうとした際、DLLが存在しないと通信できずにエラーになってしまうように、
リナックスでもソフトウエア間の通信をする場合は、あらかじめ決められたファイルを用意する必要があり、そのファイルがソケットなのかなと思っています。
現在の私の理解度はこのような感じです。
全然違っていたらすみません。

お礼日時:2006/10/02 21:22

>「mysocket=」ではなく「mysocket」でした(コピペミスかな???)



lsが-Fオプション付きでaliasでもされているのではないでしょうか?
-Fオプション付きでlsコマンドを実行するとソケットファイルの後ろに「=」が付きます。

○ls(1)コマンド
 http://www.linux.or.jp/JM/html/GNU_fileutils/man …

参考URL:http://www.linux.or.jp/JM/html/GNU_fileutils/man …
    • good
    • 0
この回答へのお礼

Leanさん、ご返信ありがとうございます。
ls -Fを試してみました。
実行ファイルの後に*が付き、
ディレクトリーの後に/が付き、
名前付きパイプの後に|が付き、
ソケットの後に=が付きました。
これはls -lほどの詳細情報までは表示しないものの、ぱっと見ファイルタイプを分かりやすくするためのオプションでしょうか。
こんなことも知らずに、またまた恥ずかしい書き込みをしてしまいました。
というか失礼な書き込みをしてしまいました。
xjdさん、すみません。
私のmanにはソケットに=が付く旨の記載だけはありませんでしたが、ちゃんと=が付きました。

お礼日時:2006/10/02 20:52

>ただ、ソケットファイルを作成する場合は、socket(2)で指定するアドレスファミリ(プロトコルファミリ)はUNIXドメイン(ロカール通信)を指定してください。



下記のページの説明にあるような感じ、socket(2)でAF_UNIX(PF_UNIX)を指定で、bind(2)もソケットファイルを指定。

○bind(2)
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
    • good
    • 0
この回答へのお礼

Leanさん、ご返信ありがとうございます。
ちょっと深いところまで手を出し過ぎて、自分の技量が追いつかないという感じがしています。
ご紹介いただいたページも、さすがに分からない単語が多すぎるため、読解を断念しました。
そういうわけで、今回もほぼ丸写し状態でコンパイルしました。
実行すると、bindのところでアドレスがすでに使用されている旨のメッセージが表示されてしまいました。
本来ならば、この原因を調査してプログラムを修正するのですが、
先にNo.4:xjdさんからいただいたソースコードを試したところ、ソケットファイルが作成できましたので、
このソースコードを調査することも断念します。。。
C言語の学習もやってみたいのですが、まずは、その土台となるシェルを習得するため、今読んでいる本をやっつけてしまいたいので。。。

お礼日時:2006/10/02 01:07

>ひょっとしてソケットを作成するコマンドは存在しないのでしょうか。



ソケットファイルはコマンドで作成するものではないので存在しません。

作りたい場合には、No.1方が書かれたようにシステムコールを使用して作成します。
ただ、ソケットファイルを作成する場合は、socket(2)で指定するアドレスファミリ(プロトコルファミリ)はUNIXドメイン(ロカール通信)を指定してください。

P.S.
>以前リナックスのファイルタイプについてお聞きしました。

質問の回答があれで良くて解決したなら、出来れば質問を閉じて欲しい。
    • good
    • 0
この回答へのお礼

Leanさん、ご返信ありがとうございます。
実は、ソケットファイルとは具体的に何をするためのファイルなのか未だに理解できていませんでした。
なぜ、ソケットファイルを作成するコマンドが知りたかったのかといいますと、
今作成しているシェルスクリプト中でファイルタイプによって処理を分岐する部分があるのですが、
そこのテストをやりたいと思ったのです。
ですので、ソケットとして正しく機能するファイルが欲しいわけではなく、
何でもいいので、とにかくカレントディレクトリーにソケットを置きたいと思ったのです。
No.1:mtfoggyさんの回答をもとに、以上の要望を満たすCプログラムを作成しようとしています。
よろしければ、No.1:mtfoggyさんのお礼欄に書いた私のソースコードをご覧いただき、助言をお願いします。

>ただ、ソケットファイルを作成する場合は、socket(2)で指定するアドレスファミリ(プロトコルファミリ)はUNIXドメイン(ロカール通信)を指定してください。
↑の助言も今の私にはよく分からなかったため、私がひとまず作成したCプログラムは↑の助言を無視しているかもしれません。

Leanさん、以前リナックスのファイルタイプについて質問したときも、納得のいく回答をいただきありがとうございました。リナックスのファイルタイプについては、まだまだ分からないことが多いですが、当時の質問は広義では解決しました。
しかし、私は欲張りな性格のため、疑問が解決した後も、何か有効な情報が寄せられることを期待して、新しい回答を受け付け続ける方針をとっています。
サイトの規則上、5件以上受付中の質問がある場合、新しい質問ができないため、新しい質問をする直前に一番古い質問を締め切るようにしています。
私の質問に回答してくださった方々には大変失礼なことと承知しておるのですが、どうかこの私の方針を貫かさせてください。

お礼日時:2006/10/01 16:43

socketシステムコールで、socketを作成し、


bindシステムコールで、socketに名前をつけたら、ファイルシステム上でlsで
見ることが出来ます。
詳しくは、manコマンドで調べてください。


# man socket

socket - create an endpoint for communication

# man bind

bind - bind a name to a socket
    • good
    • 0
この回答へのお礼

mtfoggyさん、ご返信ありがとうございます。
システムコールについて調べました。
サイトによるとシステムコールとはカーネルの機能を使用することだそうで、
C言語のソースを紹介するページがたくさんありました。
C言語は学生時代にほんの少し習っただけですので、ほとんど忘れているのですが、
見よう見まねで次のソースコードを書きました。
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(PF_INET, SOCK_STREAM, 0);
server_address.sin_family = PF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = 9374;
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *) &server_address, server_len);
}

ソケットというものが分かっていませんので、とりあえずほとんどそのまま書き写したという感じです。
cc test.cを実行するとa.outが作成されました。
これは、とりあえず構文エラーがなく正常にコンパイルできたということですよね。
この作成されたa.outを実行すればカレントディレクトリーへ何かしらの名前で特殊ファイル「ソケット」が作成されるのだと予想していたのですが、
何も見つかりませんでした。
mtfoggyさん、私のソースコードに何かが足りないのでしょうか。
それとも、このソースは私がやりたいこととは全く違うことをやっているのでしょうか。
目的はソケットを使用して何かやりたいというわけではなく、
ただ単に、カレントディレクトリー中にソケットを作成して、それをls -lで見てみたいと思っているのです。

お礼日時:2006/10/01 15:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!