C++で遊んでみる。

実際にこれベースのものが、知人のサイトで動作しています。@@;

よそで書いたものの転載。初歩のC++でSSI includeで使うもの。Linux上のg++用に書いたが、他環境では動くかな?

C++でのロックの仕組みがいまいちよくわからず、昔ながらのファイルロックでごまかしている。まぁ初歩なので :D 参考にしたのは、LaTeXで有名な奥村研のC++入門。

////////////////////////////
//
// まったく初歩的なアクセスカウンター Ver 0.01a
// Date: 2008/10/11
// Author: *************
// License: GPL v2
// (とってもローパワーなサーバ用 with g++)
//
////////////////////////////
//
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <unistd.h>
#define COUNT "count.dat"
#define LOCKFILE "count.lock"
#define LOCKCOUNT 18
using namespace std;

int make_lock()
{
    int i;
    int r=-1;
    for(i=0;i<LOCKCOUNT;i++){
      ifstream cf(LOCKFILE);
      if (!cf) {
        r = 0;
        ofstream gf(LOCKFILE);
        gf << 1;
        gf.close();
        break;
      }
      sleep(1);
    }
    return(r);
}

void kill_lock()
{
    remove(LOCKFILE);
}

int in_counter()
{
    int n;
    if (make_lock() == -1) {
      n = -1;
    } else {
      ifstream f(COUNT);
      if (f) {
        f >> n;
        f.close();
      } else {
        n = 0;
      }
      n++;
      ofstream g(COUNT);
      if (g) {
        g << n;
        g.close();
      }
      kill_lock();
    }
    return(n);
}

string aismain()
{
    string a = "";
    time_t t = time(0);
    tm *x = localtime(&t);
    if (x->tm_hour > 5 && x->tm_hour < 10) {
        a += "おはよう";
    } else if (x->tm_hour < 15) {
        a +="こんにちは";
    } else {
        a +="こんばんは";
    }
    a += "。";
    return(a);
}

int main()
{
    int lf = in_counter();
    const char* h = "Content-Type: text/html; charset=UTF-8\n\n";
    cout << h << aismain();
    if (lf == -1) {
      cout << "ロックファイルエラーです!";
    } else {
      cout << "あなたは" << lf << "番めです";
    }
    cout << "\n";
}