読者です 読者をやめる 読者になる 読者になる

ポジローぽけっと

昨日より今日、今日より明日を信じて、トライトライ

第五回スパルタンプログラミング

前回の復習

ポインタのポインタが分かってない。

構造体のメンバに文字列をコピったり

int rightassign(struct metaperson *someone){
    char name[]="isshi";//ポインタを代入
    fprintf(stderr, "assign %s\n", (*someone).name);                                                                                                                 
    (*someone).name=(char *)malloc(sizeof(char)*(strlen(name)+1));//strlenは\0直前までの文字数を求める
    strncpy((*someone).name, name, strlen(name));//文字列をコピー

    return 0;
}

文字列リテラルぐぬぬとなったり

char *name = "ABC"//は静的領域を確保して、その先頭ポインタをnameに代入
char name[] = "ABC"//は配列を作って、ABCをコピーしていれる。

文字列リテラルはここが分かりやすいかも

今日何がしたいのか

  • コードの整理(規約、ファイルの分割)
  • あいかわらずHTTP/1.0対応

結局、yylexに一日はまって終わってしまた。うむむ

調べたこと

Q:makefileだとwarningがでないのはなんでだ?

A:makefile内のgccはbashrcのaliasは無効。なぜならmakefile内でtype gccすると/usr/bin/gccと出る。

知らんかったこと

yylex()はresultにYY_NULL,すなわちEOFが入るまで繰り返し実行される。

はまりんこ

クライアントからの接続要求を受け、fdopenで開いたファイルストリームをyyinに代入する。

そうすると、HTTP 1.1だとsocketクローズしないんですけど!!だから、クライアントからEOFが入らないとyylex()から帰ってこない!!

解消方法

YY_INPUTマクロの再定義して、EOFだけでなく、バッファサイズと終端の改行コード(CR+LF)でチェックするとか

いっしーのコーディング

ブロッキングしたfgetsで

#include <unistd.h>
#include <fcntl.h>
int sockflags;
sockfd = accept(listensock->fd, (struct sockaddr *)&(listensock->addr), &(listensock->socklen));
sockflags = fcntl(sockfd, F_GETFL, 0);
sockflags |= O_NONBLOCK;//非ブロッキング化する
fcntl(sockfd, F_SETFL, sockflags);

とった文字列をyylex()に渡せるようにするとか

int lexerString(const char *received_string)                                                                                                                           
{
  YY_BUFFER_STATE yy_received_buffer;
  yy_received_buffer = yy_scan_string(received_string);
  yylex();
  yy_delete_buffer(yy_received_buffer);

  return 0;
}

注意:fp=fdopenのfpをfcloseするとfdもクローズしてしまっているようにだったよー、調べてみ。byいっしー

ブロッキング化について

  1. ファイルディスクリプタを非ブロッキング化する。
  2. fdopenでファイル構造体にfpにfdが入る。
  3. ファイル操作関数の挙動は上記fdによって変わる。

興味

ブロッキング化は何の対象の性質を変えることで実現しているのか?

fgetsのソース見たけど、fgetsがfpの性質見て挙動変えてるわけではなかった。