C言語

Linuxのopen(低水準入出力)の使い方やfopenとの違いをまとめていく

調べていたら思ったよりはまってしまったので、これを機にopenに関してまとめておく。 open の基礎知識 openとは、Unixにおける入出力システムを提供してくれる関数のこと。早い話が、C言語のfopenの低レベルバージョンの関数。 #include <sys/types.h> #include <sys/stat.h> #includ</sys/stat.h></sys/types.h>…

なぜ子プロセスを呼び出した時にsetsid()を使うのか?

「tinytinyhttpd/httpd.cxx at master · mattn/tinytinyhttpd」のコードを読んでいた時に、以下のコードを見かけた。 child = fork(); if (!child) { setsid(); setpgid(0, 0); setsid();とは、新たなセッションを作成する関数だが、なぜ子プロセスの実行前…

C言語からRubyやPHPなどのスクリプト言語を呼び出して、実行結果をC言語に渡す方法

最近、自作httpサーバーをC言語で書いているが、「C言語側からRubyやPHPを呼び出して、そのRubyの実行結果をC言語側に渡す」という方法が分からなかった。 いろいろ調べた所、「これでOK」という方法が見つかったので、備忘録としてまとめていく。 開発環境 …

C言語の安全な文字列コピーは、strcpyよりもstrncpy、そしてstrlcpyが良い

C言語を触っている時に文字列コピーを行いたい場合がありますが、その時にどの関数を使えば良いのか、の考察をしていく。 strcpy 文字列コピーで代表的なのが、strcpy。最もシンプルな関数だが、最も安全性が低いともいえる。 ポイントとしては、コピーされ…

C言語のstrstr関数の色々な使い方

C言語の文字列処理でよく使うstrstr関数の解説をしていく。 strstrの簡単なおさらい 第1引数の文字列の中から、第2引数の文字列が出てくる場所を探索する。もし、存在しなければNULLを返す。 単純に文字列を探索するよりも、「もし、探索したい文字列中に…

C言語でTCPクライアント・サーバーを実装する

ソケットとかTCPを理解するために、C言語でTCPクライアント、サーバーを実装していく。 今回は、TCPの超基本を理解するために、「クライアントから送られたデータを、サーバーがそのまま送り返す」というechoサーバーを実装する。 説明のやり方として、まず…

ダブルポインタ(ポインタのポインタ)のメリットや使い道を紹介する

C言語では、ポインタを使うことで柔軟なデータ構造を表現できるが、今までダブルポインタ(ポインタのポインタ)についてイマイチ理解できていなかった。 色々調べていくと、ダブルポインタのメリットや使い道が分かってきたので、紹介していく。 ダブルポイン…

segmentation fault 11(core dumped)の原因と2つのチェックポイント

C言語やC++を触っていると、segmentation fault 11(core dumped)というエラーが発生する時がある。 今回は、このsegmentation fault 11(core dumped)の原因や起こった時の対処法を2つ紹介していく。 segmentation fault 11(core dumped)の原因とは? segment…

WindowsのMinGWでdxlib(DXライブラリ)を使う手順を紹介する

WindowsのMinGWでdxlib(DXライブラリ)が使えるようにしたので、その手順を紹介していきます。 また、今回の手順は公式ドキュメント「DXライブラリ置き場 使い方説明」を参考にしています。 開発環境 WIndows 10 (2019/ 05/ 15時点) MinGW Thread model: wi…

C言語の配列で範囲外にアクセスできてしまう理由と対策法

長らくRubyやjavaScript等の高級言語を扱っていると、C言語の原始的な処理に戸惑う時がある。 実際に今日C言語で配列を扱っていた時に、自分が定義した配列の範囲外に誤ってアクセスしたせいで思わぬ動作をする、と言うミスをしてしまった。 そこで今回は、C…

C言語のfopen関数で「警告: 2 番目の ‘fopen’ の引数へ渡すときに整数からキャスト無しにポインタを作成しています [デフォルトで有効]」と言うエラーが出たときの対処法

解決してみると相当しょうもない事でハマってしまったので、メモとして解決策を書いておきます。 今回C言語のfopen関数を触って出たエラーは以下の通り。 bf.c:50:3: 警告: 2 番目の ‘fopen’ の引数へ渡すときに整数からキャスト無しにポインタを作成してい…

C言語の型キャストについてのまとめ

C言語の型キャストについて勉強したので、まとめ。ちなみに、型キャストは型変換とも呼ばれている。 計算における型キャスト C言語において異なる型同士で計算を行った場合、より精度の高い型に合わせて計算が行われるようになっている。 例えば、float + in…

C言語のvoidの使い方について

C言語のvoidの使い方について調べたので、まとめておく。 関数定義におけるvoidについて 関数定義におけるvoidは、単純に「戻り値がない関数」を作る時に使うもの。 void createFunction() { 処理 } voidはmain関数に対して使うことができる。 ポインタとし…

C言語のsizeofにおける配列、ポインタ、構造体などの動きのまとめ

C言語のsizeofについて色々調べたのでまとめてみました。 sizeofとは何か? sizeofとは、型や変数などのメモリサイズを返す関数のこと。例えば、intやfloat等の型を指定した場合は「型が利用するメモリサイズ」を返し、変数やポインタ、構造体を指定した場合…

C言語のコンパイルにおけるアセンブラ→実行ファイルまでの流れをまとめてみた

備忘録として、C言語のコンパイルの流れをまとめてみた。 C言語のコンパイラの大まかな流れ 簡単なプログラムであればgcc test.cだけでコンパイルが可能だが、実際のコンパイルは以下の4つの手順を踏んでいる。 プリプロセッサでソースコードをコンパイラが…