第五回スパルタンプログラミング
前回の復習
ポインタのポインタが分かってない。
構造体のメンバに文字列をコピったり
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)でチェックするとか
- https://forums.freebsd.org/viewtopic.php?&t=36148
- http://unixhelp.ed.ac.uk/CGI/man-cgi?lex
- http://www.hariguchi.org/info/ja/flex-2.3.7/flex.html
いっしーのコーディング
非ブロッキングした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いっしー
非ブロッキング化について
興味
非ブロッキング化は何の対象の性質を変えることで実現しているのか?
fgetsのソース見たけど、fgetsがfpの性質見て挙動変えてるわけではなかった。