main()関数なしで動作するCプログラムの書き方
C言語のプログラムは、main()関数がなくても実行できるのでしょうか?答えは「はい」です。実は、main()を持たないプログラムを書くことが可能です。
一般的に、main()はプログラム実行のエントリーポイント(開始地点)であると説明されます。これはあくまでプログラマーの視点から見た話で、実際にはシステムの視点では異なります。システムはまず_start()を呼び出して実行環境をセットアップし、その後main()を呼び出します。
つまり、この_start()を自前で定義すれば、main()が存在しなくてもプログラムを動作させられるのです。
サンプルコード
#include <stdio.h>
extern void _exit(register int);
int _start() {
printf("Program without main\n");
_exit(0);
}コンパイルと実行方法
このプログラムをコンパイルする際は、GCCに-nostartfilesオプションを指定します。このオプションにより、標準のスタートアップファイル(通常main()を呼び出すコード)がリンクされなくなります。
実行例
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ gcc test_prog.c -nostartfiles soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ ./a.out Program without main soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$
解説
_start():LinuxなどのELF形式の実行ファイルにおいて、OSが最初に呼び出す本当のエントリーポイントです。_exit(0):標準ライブラリの終了処理(exit())を介さず、直接システムコールでプロセスを終了させています。クリーンアップ処理を行わないため、軽量ですが使用には注意が必要です。
このテクニックは、ブートローダーや組み込みシステム、OSカーネルなど、標準的なCランタイム環境が利用できない場面で特に役立ちます。
-
Windows 7の起動時にプログラムの自動実行を停止する10の方法
Windowsパソコンの起動後、特定のグループに属するプログラムは、ユーザーがWindowsにログインすると同時に自動的に立ち上がります。これらの「スタートアップ項目」には、ユーザーがインストールしたサードパーティ製ソフトウェア(起動時の実行があらかじめ設定されているもの)から、システムの動作に必要なWindows標準プログラムまで、さまざまな種類が含まれています。Windowsは、コンピューターの完全な制御権をユーザーに委ねるオペレーティングシステムです。そのため、起動時にどのプログラムを実行させるか、あるいは実行させないかを決める権限も、最終的にはユーザー自身が持っています。Windows
-
スマホなしでWeChat Webにログインする方法|QRコード認証の手順を徹底解説
WeChat(微信)は、中国発の人気インスタントメッセージング&ソーシャルメディアアプリです。WhatsAppやFacebook Messengerなどのグローバルなメッセージングプラットフォームに代わるものとして中国で開発され、データプライバシーと監視対策が強化されています。現在では世界で10億人以上のアクティブユーザーが利用しており、モバイルアプリだけでなく「WeChat Web」というブラウザ版ログイン機能も提供されています。この機能を使えば、デスクトップからでも常にWeChatでつながり続けることが可能です。 本記事では、スマホ(電話番号と認証コード)を使わずにWeChat Webへロ