以前リナックスのファイルタイプについてお聞きしました。
今、これらのファイルの作成方法をネットで調べたのですが、ソケットの作成方法だけは調べ切れませんでした。
ソケット以外は次のように調べられました。
普通のファイル:
touchやecho + リダイレクション
ディレクトリー:
mkdir
シンボリックリンク:
ln -s
名前付きパイプ:
mkfifo
キャラクタスペシャルファイル、ブロックスペシャルファイル:
mknod
どのサイトにもこれらの説明は掲載されているのですが、なぜかソケットの作成方法が掲載されていません。
ひょっとしてソケットを作成するコマンドは存在しないのでしょうか。
詳しい方、教えてください。
No.4ベストアンサー
- 回答日時:
>目的はソケットを使用して何かやりたいというわけではなく、
>ただ単に、カレントディレクトリー中にソケットを作成して、それを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=
#
xjdさん、ご返信ありがとうございます。
ソケットファイル「mysocket」を作成することができました。
「mysocket=」ではなく「mysocket」でした(コピペミスかな???)
超手抜きプログラムとはいうものの、
C言語の知識がほとんどない私にとっては、このソースを解読するのに相当時間がかかります。
そこで、頂いたソースコードのif文や#includeをはしょって、さらなる超々小型プログラムに作り替えて実行しました。
No.7
- 回答日時:
>例えば異なるアプリケーションソフトA-B間のデータ通信を担う専用のDLLがあるとすると、
>このDLLがリナックスのソケットファイルに当たるのかなと思いました。
違います。
DLLは、Dynamic Link Libraryですから、DLLに該当するのはこの場合socket()やbind()というシステムコールです。
ソケットはプロセス間ので通信を行うためのインタフェースの一種で、そのソケットの中にソケット・ファイルというものがあるという事です。
Leanさん、ご返信ありがとうございます。
ソケットファイルというのは、あくまでソケットの一種なのですね。
これを念頭に置き、ソケットについて検索してみました。
ソケットというのは何かの実体ではなく通信をするための1つの方法のことなのですね。
そして、ソケットファイルというのはユニックス中で、このソケットと同様の通信をするためのファイルという理解でどうでしょうか。
以前教わった名前付きパイプも、このソケットファイルと同様にプロセス間通信をするためのファイルということから両者は同じ様な機能を提供する特殊ファイルなのだと思いました。
インターネットをするときフレッツにするか、てぷこにするか選択するような感じでしょうか。
No.6
- 回答日時:
>実は、ソケットファイルとは具体的に何をするためのファイルなのか未だに理解できていませんでした。
例えば、あるWEBサイトを見る場合、ブラウザを起動しURLを入力して見ようとしているWEBサイトにアクセスしますよね。
この時ブラウザはWEBサーバからHTMLファイルや画像ファイルといったデータを受け取っています。
逆にWEBサーバから見れば、ブラウザからこのHTMLが欲しい、この画像ファイルが欲しいという要求を受け取っています。
つまり、ブラウザとWEBサーバ間で通信して相互にデータのやりとりをしているのは理解出来ますよね?
この時相互のデータのやりとりに使用されているのがsocketです。
このsocketの中でブラウザ-WEBサーバ間はTCP/IPを使用していますが、ファイルを通してでもデータを相互にやりとりが出来ます。
その時使用されるファイルがソケット・ファイルです。
ただし、ソケット・ファイルはファイルですので同一マシン上のプロセス(プログラム)間でしか使用出来ないというのはあります。
netstatコマンドを実行すると「Active UNIX domain sockets」というような項目がありその下に情報が表示されますが、その情報の一番右にファイル名が表示されているものがあると思いますが、それがソケット・ファイルです。
Leanさん、連続返信ありがとうございます。
今WindowsのDLLを思い浮かべています。
例えば異なるアプリケーションソフトA-B間のデータ通信を担う専用のDLLがあるとすると、
このDLLがリナックスのソケットファイルに当たるのかなと思いました。
アプリケーションソフトAからBを呼び出そうとした際、DLLが存在しないと通信できずにエラーになってしまうように、
リナックスでもソフトウエア間の通信をする場合は、あらかじめ決められたファイルを用意する必要があり、そのファイルがソケットなのかなと思っています。
現在の私の理解度はこのような感じです。
全然違っていたらすみません。
No.5
- 回答日時:
>「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 …
Leanさん、ご返信ありがとうございます。
ls -Fを試してみました。
実行ファイルの後に*が付き、
ディレクトリーの後に/が付き、
名前付きパイプの後に|が付き、
ソケットの後に=が付きました。
これはls -lほどの詳細情報までは表示しないものの、ぱっと見ファイルタイプを分かりやすくするためのオプションでしょうか。
こんなことも知らずに、またまた恥ずかしい書き込みをしてしまいました。
というか失礼な書き込みをしてしまいました。
xjdさん、すみません。
私のmanにはソケットに=が付く旨の記載だけはありませんでしたが、ちゃんと=が付きました。
No.3
- 回答日時:
>ただ、ソケットファイルを作成する場合は、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 …
Leanさん、ご返信ありがとうございます。
ちょっと深いところまで手を出し過ぎて、自分の技量が追いつかないという感じがしています。
ご紹介いただいたページも、さすがに分からない単語が多すぎるため、読解を断念しました。
そういうわけで、今回もほぼ丸写し状態でコンパイルしました。
実行すると、bindのところでアドレスがすでに使用されている旨のメッセージが表示されてしまいました。
本来ならば、この原因を調査してプログラムを修正するのですが、
先にNo.4:xjdさんからいただいたソースコードを試したところ、ソケットファイルが作成できましたので、
このソースコードを調査することも断念します。。。
C言語の学習もやってみたいのですが、まずは、その土台となるシェルを習得するため、今読んでいる本をやっつけてしまいたいので。。。
No.2
- 回答日時:
>ひょっとしてソケットを作成するコマンドは存在しないのでしょうか。
ソケットファイルはコマンドで作成するものではないので存在しません。
作りたい場合には、No.1方が書かれたようにシステムコールを使用して作成します。
ただ、ソケットファイルを作成する場合は、socket(2)で指定するアドレスファミリ(プロトコルファミリ)はUNIXドメイン(ロカール通信)を指定してください。
P.S.
>以前リナックスのファイルタイプについてお聞きしました。
質問の回答があれで良くて解決したなら、出来れば質問を閉じて欲しい。
Leanさん、ご返信ありがとうございます。
実は、ソケットファイルとは具体的に何をするためのファイルなのか未だに理解できていませんでした。
なぜ、ソケットファイルを作成するコマンドが知りたかったのかといいますと、
今作成しているシェルスクリプト中でファイルタイプによって処理を分岐する部分があるのですが、
そこのテストをやりたいと思ったのです。
ですので、ソケットとして正しく機能するファイルが欲しいわけではなく、
何でもいいので、とにかくカレントディレクトリーにソケットを置きたいと思ったのです。
No.1:mtfoggyさんの回答をもとに、以上の要望を満たすCプログラムを作成しようとしています。
よろしければ、No.1:mtfoggyさんのお礼欄に書いた私のソースコードをご覧いただき、助言をお願いします。
>ただ、ソケットファイルを作成する場合は、socket(2)で指定するアドレスファミリ(プロトコルファミリ)はUNIXドメイン(ロカール通信)を指定してください。
↑の助言も今の私にはよく分からなかったため、私がひとまず作成したCプログラムは↑の助言を無視しているかもしれません。
Leanさん、以前リナックスのファイルタイプについて質問したときも、納得のいく回答をいただきありがとうございました。リナックスのファイルタイプについては、まだまだ分からないことが多いですが、当時の質問は広義では解決しました。
しかし、私は欲張りな性格のため、疑問が解決した後も、何か有効な情報が寄せられることを期待して、新しい回答を受け付け続ける方針をとっています。
サイトの規則上、5件以上受付中の質問がある場合、新しい質問ができないため、新しい質問をする直前に一番古い質問を締め切るようにしています。
私の質問に回答してくださった方々には大変失礼なことと承知しておるのですが、どうかこの私の方針を貫かさせてください。
No.1
- 回答日時:
socketシステムコールで、socketを作成し、
bindシステムコールで、socketに名前をつけたら、ファイルシステム上でlsで
見ることが出来ます。
詳しくは、manコマンドで調べてください。
# man socket
socket - create an endpoint for communication
# man bind
bind - bind a name to a socket
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で見てみたいと思っているのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onedriveの中身を削除したらパ...
-
mrl→midファイルへ
-
office365 ファイルを削除したい
-
mac 表示できなくなりました。
-
クラリスワークスのファイルを...
-
macのdmgファイル(動画)をMP4...
-
emlをtxtに変換するには?
-
「123 ファイル」を開く方法を...
-
Androidでダウンロードに失敗し...
-
VScodeでjarファイルを開く方法
-
MacのPagesで、ファイルの分割...
-
エクセルファイルの完全消去に...
-
【パワポ】フォルダ内の複数フ...
-
ファイル名に#***#
-
iMovieとgifファイルの読み込み...
-
Windowsあらかじめにあるドライ...
-
リナックスの特殊ファイル「ソ...
-
同期センターのマークが出てま...
-
分割されたrarファイルを結合す...
-
ファイルソートができるMac用フ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Winmerge ファイルの中身は同じ...
-
教えてください!困ってます。
-
同期センターのマークが出てま...
-
onedriveの中身を削除したらパ...
-
ファイルの先頭行を全て削除したい
-
バッチファイルで変数の中身を...
-
ODBCエラー「admin」によってロ...
-
ファイルの単位
-
Windows10 フォルダ内の自動並...
-
macのdmgファイル(動画)をMP4...
-
mrl→midファイルへ
-
emlをtxtに変換するには?
-
コマンドプロンプトによるフォ...
-
外字ファイル、eudc.tte と e...
-
office365 ファイルを削除したい
-
フォルダ内の一覧を印刷するには?
-
VScodeでjarファイルを開く方法
-
クラリスワークスのファイルを...
-
Excellにて→ファイルエラー:デ...
-
mac ファイルの詳細情報を編集...
おすすめ情報