#include < stdio.h > #include < signal.h > #define R (0) #define W (1) int popen2(char *command,int *fd_r, int *fd_w) { int pipe_c2p[2],pipe_p2c[2]; int pid; if(pipe(pipe_c2p)<0){ perror("popen2"); return(-1); } if(pipe(pipe_p2c)<0){ perror("popen2"); close(pipe_c2p[R]); close(pipe_c2p[W]); return(-1); } if((pid=fork())<0){ perror("popen2"); close(pipe_c2p[R]); close(pipe_c2p[W]); close(pipe_p2c[R]); close(pipe_p2c[W]); return(-1); } if(pid==0){ close(pipe_p2c[W]); close(pipe_c2p[R]); dup2(pipe_p2c[R],0); dup2(pipe_c2p[W],1); close(pipe_p2c[R]); close(pipe_c2p[W]); if(execlp("sh","sh","-c",command,NULL)<0){ perror("popen2"); close(pipe_p2c[R]); close(pipe_c2p[W]); exit(1); } } close(pipe_p2c[R]); close(pipe_c2p[W]); *fd_w=pipe_p2c[W]; *fd_r=pipe_c2p[W]; return(pid); }
popen()
#include < stdio.h > #include < string.h > void main() { char str[512],*ptr; FILE *fp; if((fp=popen("ls -1","r"))==NULL){ fprintf(stderr,"error!!!\n"); exit(-1); } while(1){ fgets(str,512,fp); if(feof(fp)){ break; } ptr=strchr(str,'\n'); if(ptr!=NULL){ *ptr='\0'; } printf("%s\n",str); } pclose(fp); }
プログラムから他のプログラムを実行
System()は、実行したいコマンドを引数で渡せばそのまま実行してくれます。厳密には、shというシェルに渡して実行してもらいます。
#include < stdio.h > #include < string.h > void main() { char filename[80],str[512],*ptr; FILE *fp; sprintf(filename,"/tmp/ls%d.tmp",getpid()); sprintf(str,"ls -1 > %s",filename); system(str); if((fp=fopen(filename,"r"))==NULL){ fprintf(stderr,"error!!!\n"); exit(-1); } while(1){ fgets(str,512,fp); if(feof(fp)){ break; } ptr=strchr(str,'\n'); if(ptr!=NULL){ *ptr='\0'; } printf("%s\n",str); } fclose(fp); sprintf(str,"rm -f %s",filename); system(str); }
読出しサンプル
#include < stdio.h > #include < math.h > #include < fcnt1.h > #include < math.h > #include < sys/types.h > #include < unistd.h > #include < sys/mman.h > typedef struct { char str[512]; long lval; double dval; }SSS; #define NUMBER (10000) void main() { int fd; long psize,size; SSS *ptr; long i; if((fd=open("MapFile",O_RDWR))== -1){ perror("open"); exit(-1); } #ifdef BSD psize=getpagesize(); #else psize=sysconf(_SC_PAGE_SIZE); #endif size=(NUMBER*sizeof(SSS)/psize+1)*psize; /* map */ ptr=(SSS *)mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); /* test */ while(1){ for(i=0;i
freopen
#include < stdio.h > #include < stdlib.h > #include < string.h > void main(int argc, char *argv[]) { FILE *fp; fp=freopen("/tmp/debug.log","w",stdout); printf("Content-type:text/html\n\n"); printf("\n"); printf("\n"); printf(" \ CONTENT=\"text/html; charset=x-euc\">\n"); printf("test \n"); printf("\n"); printf("\n"); printf("test
\n"); printf("\n"); printf("\n"); }
ディレクトリ内容の読み出し
#include < stdio.h > #include < dirent.h > void main(int argc,char *argv[]) { DIR *dir; struct dirent *dp; char path[512]; if(argc<=1){ strcpy(path,"."); } else { strcpy(path,argv[1]); } if((dir=opendir(path))==NULL){ perror("opendir"); exit(-1); } for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){ printf("%s\n",dp->d_name); } closedir(dir); }
可変引数の用途
#include < stdio.h > #include < varargs.h > int debug_print(va_alist) va_dcl { va_list args; char *fmt; char buf[256]; va_start(args); fmt=va_arg(args,char *); vsprintf(buf,fmt,args); va_end(args); fprintf(stderr,"DEBUG[ %s \n",buf); return(0); }
グローバルデータを使う方法
unsigned char Map[ 100 ][ 100 ]; void main() { InitMap(); LoadMapData(); SaveMapData(); } int InitMap() { int x, y; for(y=0;y<100;y++){ for(x=0;x<100;x++){ Map[x][y]=(unsigned char)0; } } return(0); } int LoadMapData() { int x,y; for(y=0;y<100;y++){ for(x=0;x<100;x++){ Map[x][y]=getc(); if(feof(stdin)){ return(-1); } } } return(0); } int SaveMapData() { int x,y; for(y=0;y<100;y++){ for(x=0;x<100;x++){ putc(Map[x][y]); } } return(0); }
関数の実装
#include < stdio.h > short GetShort(); void main() { short num; while(1){ /* short standard input, insert to num */ num=GetShort(); /* display num binary */ ShortBinPrint(num); } } short GetShort() { char buf[80]; short num; fgets(buf, sizeof(buf)-1,stdin); num=(short)atoi(buf); return(0); } int ShortBinPrint(num) short num; { char buf[20]; ShortToBinString(num,buf); printf("%\n",buf); return(0); } int ShortToBingString(num,buf) short num; char *ptr; ptr=buf; for(i=15;i>=0;i--){ *ptr=(char)(((num>>i)&0x01)+'0'); ptr++; } *ptr='\0'; return 0; }
プログラミングの構造化
プログラミングをゼロから組む場合にどうすればいいか。
フローチャートなどを書いてから書くのはあまり効率的であるとは言えません。
よくあるのがコメントで構造を作っていく手法です。
#include < stdio.h > void main() { short num; while(1){ /* short standard input, insert to num */ /* display num binary */ } }
これなら、時間もかかりません。