<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Redis on kkato.dev</title>
    <link>https://kkato.dev/tags/redis/</link>
    <description>Recent content in Redis on kkato.dev</description>
    <image>
      <title>kkato.dev</title>
      <url>https://kkato.dev/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://kkato.dev/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.146.0</generator>
    <language>en</language>
    <lastBuildDate>Mon, 06 Apr 2026 08:20:51 +0900</lastBuildDate>
    <atom:link href="https://kkato.dev/tags/redis/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>C言語で CodeCrafters Redis を実装した時のメモ</title>
      <link>https://kkato.dev/posts/codecrafters-redis-c/</link>
      <pubDate>Mon, 06 Apr 2026 08:20:51 +0900</pubDate>
      <guid>https://kkato.dev/posts/codecrafters-redis-c/</guid>
      <description>&lt;p&gt;CodeCrafters は HTTP サーバーやシェルなどを車輪の再発明するウェブサイトです。C言語で Redis を実装した際に調べた関数や構造体を備忘録としてまとめました。&lt;/p&gt;
&lt;h3 id=&#34;ソケット通信の全体の流れ&#34;&gt;ソケット通信の全体の流れ&lt;/h3&gt;
&lt;p&gt;サーバー側のソケット通信は以下の順で関数を呼び出します。&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    A[&amp;#34;socket()\nソケットを作成してファイルディスクリプタを取得&amp;#34;]
    B[&amp;#34;setsockopt()\nソケットのオプションを設定（SO_REUSEADDR など）&amp;#34;]
    C[&amp;#34;bind()\nソケットに IP アドレスとポート番号を紐づける&amp;#34;]
    D[&amp;#34;listen()\n接続待ち状態にする&amp;#34;]
    E[&amp;#34;accept()\nクライアントからの接続を受け付ける（ブロッキング）&amp;#34;]
    F[&amp;#34;read / write\nクライアントとデータをやりとりする&amp;#34;]

    A --&amp;gt; B --&amp;gt; C --&amp;gt; D --&amp;gt; E --&amp;gt; F
&lt;/pre&gt;

&lt;h3 id=&#34;各関数のメモ&#34;&gt;各関数のメモ&lt;/h3&gt;
&lt;h4 id=&#34;void-setbuffile-stream-char-buf&#34;&gt;void setbuf(FILE *stream, char *buf)&lt;/h4&gt;
&lt;p&gt;ストリーム（&lt;code&gt;FILE *&lt;/code&gt;）に対するバッファリング動作を制御する関数です。例えば &lt;code&gt;stdout&lt;/code&gt; ストリームに対して設定すると、そこへ書き込む &lt;code&gt;printf&lt;/code&gt; などが影響を受けます。&lt;/p&gt;
&lt;p&gt;ストリームの代表的なものは以下の3つで、プログラム起動時に自動で用意されます。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ストリーム&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;stdout&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;標準出力。&lt;code&gt;printf&lt;/code&gt; はここに書き込む&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;stderr&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;標準エラー出力。エラーメッセージの出力に使う&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;stdin&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;標準入力。&lt;code&gt;scanf&lt;/code&gt; や &lt;code&gt;fgets&lt;/code&gt; はここから読み込む&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;引数&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;対象のストリーム（&lt;code&gt;stdout&lt;/code&gt;・&lt;code&gt;stderr&lt;/code&gt; など）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;buf&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;使用するバッファへのポインタ。&lt;code&gt;NULL&lt;/code&gt; を渡すとバッファリングが無効になる&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;NULL&lt;/code&gt; を渡すと書き込みが即座に反映されます。デバッグ時や、ログをリアルタイムで確認したい場合に使います。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;setbuf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// バッファなし（即時出力）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;setbuf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// buf に指定したバッファを使う
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;int-socketint-domain-int-type-int-protocol&#34;&gt;int socket(int domain, int type, int protocol)&lt;/h4&gt;
&lt;p&gt;ソケットを作成してファイルディスクリプタを返します。失敗時は &lt;code&gt;-1&lt;/code&gt; を返します。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
