C言語によるプログラミング応用編という本でプログラミングの勉強をしています。
本から引用
ネットワーク越しにデータのやり取りを行う場合に用いるBerkley Socketは、標準入出力関数が利用するストリームポインタではなくディスクリプタをを用いたものとなっています。
このようにいきなりディスクリプタという言葉が出てきて意味をネットで調べましたが、分かりませんでした。
その意味を教えてください。
それと、システムコールを用いてストップウォッチを作るサンプルプログラムが載っていて、それを入力しgccでコンパイルしましたが、できませんでした。
gcc version 5.2.1 20151010
gcc -v と打つと
省略
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.2.1-22ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
省略
POSIXと記録されているので、gccでもシステムコールの関数が使えると思うのですが、やり方を教えてください。
それともgccではできないのでしょうか。
Ubuntu 15.10を使用しています。
よろしくお願いします。
追記 : 16/10/10
教えて頂いた通りに修正しましたがまだ、コンパイルができず、実行ファイルができません。
修正したコードと実行結果を載せますのでよろしくお願いします。
07_01.c
#include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <signal.h> #include <sys/time.h> #define DATA_FILENAME "./stopwatch.dat" int iniTime(struct timeval *startTime) { int fd,ret=0; gettimeofday(startTime,NULL); if((fd=open(DATA_FILENAME,O_WRONLY|O_CREAT|O_TRUNC,0644))<0) return -1; if(write(fd,startTime,sizeof(*startTime))!=sizeof(*startTime)) ret=-1; close(fd); return ret; }
07_02.c
#include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <fcntl.h> #include <signal.h> #define DATA_FILENAME "./stopwatch.dat" int restoreTime(struct timeval *startTime) { int fd,ret=0; if((fd=open(DATA_FILENAME,O_RDONLY))<0) return -1; if(read(fd,startTime,sizeof(*startTime))!=sizeof(*startTime)) ret =-1; close(fd); return ret; }
07_04.c
#include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <fcntl.h> #include <signal.h> int restoreTime(struct timeval *startTime); void printDiff(struct timeval *t1,struct timeval *t2); void lastTime(int unused) { struct timeval startTime,lastTime; if(restoreTime(&startTime)<0) exit(EXIT_FAILURE); gettimeofday(&lastTime,NULL); printDiff(&lastTime,&startTime); exit(EXIT_SUCCESS); }
07_05.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <fcntl.h> #include <signal.h> void printDiff(struct timeval *t1,struct timeval *t2) { struct timeval diff; timersub(t1,t2,&diff); printf("%02lu:%2lu.%02lu\n", diff.tv_sec/60, diff.tv_sec%60, diff.tv_usec/10000); }
main.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <fcntl.h> #include <signal.h> int initTime(struct timeval *startTime); int restoreTime(struct timeval *startTime); void lastTime(int unused); void printDiff(struct timeval *t1,struct timeval *t2); int main(int argc,char *argv[]) { int c; struct timeval startTime={0,0},currentTime; while((c=getopt(argc,argv,"cs"))!=EOF) { switch(c) { case 's': if(initTime(&startTime)<0) { fprintf(stderr,"開始時刻の初期化、書き込みに失敗\n"); exit(EXIT_FAILURE); } break; case 'c': if(restoreTime(&startTime)<0) { fprintf(stderr,"開始時刻の読み込みに失敗\n"); exit(EXIT_FAILURE); } break; } } if(startTime.tv_sec==0||argc!=2) { fprintf(stderr,"-sまたは-cオプションを指定してください。\n"); exit(EXIT_FAILURE); } signal(SIGINT,lastTime); while(1) { sleep(1); gettimeofday(¤tTime,NULL); printDiff(¤tTime,&startTime); } exit(EXIT_SUCCESS); }
ターミナルでコンパイルすると、
$ gcc 07_01.c 07_02.c 07_04.c 07_05.c main.c /tmp/cc8inniA.o: 関数 `main' 内: main.c:(.text+0x4a): `initTime' に対する定義されていない参照です collect2: error: ld returned 1 exit status $

回答3件
あなたの回答
tips
プレビュー