質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

360閲覧

c言語 socket WSLだけ、F_SETOWN が常に-1を返す理由

akiyama3284pga

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2022/08/04 11:23

問題のコード

fcntl(sock, F_SETOWN, getpid());

上記のコードで、エラーとなりました。
返り値は-1で、erronoは"invalid arguments" です。

全く同じプログラムでも純粋なubuntu環境ではエラーはでませんでした。
wslのバージョンは、Ubuntu 20.04.4 LTS です。

更に不可解なのが、
wslでもsocketがudpの場合にはエラーとならない点です。

※ nonblocking(非同期)設定などはエラーにはなりません。(F_SETOWNだけです...)

fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC);

このあたりが関係しているのだと思うのですが...
何かヒントを頂けましたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WSL1 と WSL2 は Windows 上で動くためのメカニズムが異なります。 WSL1 では Linux システムコールを Windows システムコールに変換することによって実現されており、 WSL2 では Linux カーネルを仮想マシン上で動かすという方法が取られています。 WSL1 は無理に Linux のマネをしている形ですので互換性が十分ではない部分があるようです。 おそらく質問者が使っているのは WSL1 ではありませんか?

WSL1 で一部のシステムコールが実装されていないのはそういうものだというほかなく、微妙な互換性で悩みたくないなら WSL2 を使うのがオススメです。

しかし WSL2 があらゆる面で優れているというわけではありません。 WSL1 を使ったほうがよい場合の例も提示されております。 WSL2 は Linux カーネルそのものを動かすという性質上、 Windows 側との連携が多少スムーズではないようです。

投稿2022/08/06 01:31

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/08/06 03:32

ありがとうございます。 おっしゃる通りでした。 本格的な開発においてはなるべく純粋なlinuxを使用するようにしたいと存じます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問