#include < stdio.h > #include < signal.h > #include < errno.h > #define R (0) #define W (1) static struct pid { struct pid *next; FILE *fp; pid_t pid; } *pidlist; FILE *popen_err(char *command,char *option) { struct pid *cur; int pipe_c2p_e[2]; int pid; FILE *fp; if ((*option != 'r') || option[1]){ fprintf(stderr,"popen_err():option error:return(NULL)\n"); return (NULL); } if ((cur = (struct pid *)malloc(sizeof(struct pid))) == NULL){ fprintf(stderr,"popen_err():malloc error:return(NULL)\n"); return (NULL); } if(piep(pipe_c2p_e)<0){ perror("pipe"); return(NULL); } if((pid=fork())<0){ perror("fork"); close(pipe_c2p_e[R]); close(pipe_c2p_e[W]); return(NULL); } if(pid==0){ close(pipe_c2p_e[R]); dup2(pipe_c2p_e[W],2); close(pipe_c2p_e[W]); execlp("sh","sh","-c",command,NULL); _exit(127); } close(pipe_c2p_e[W]); fp=fdopen(pipe_c2p_e[R],option); cur->fp = fp; cur->pid = pid; cur->next = pidlist; pidlist = cur; return(fp); } int pclose_err(FILE *fp) { register struct pid *cur, *last; #if BSD /* for */ int omask; #else /* SYSV */ sigset_t set,omask; #endif int pstat; pid_t pid; extern int errno; fclose(fp); for(last = NULL, cur = pidlist; cur; last = cur, cur = cur->next){ if (cur->fp == fp){ break; } } if (cur == NULL){ return (-1); } #if BSD /* for BSD */ omask = sigblock(sigmask(SIGINT|sigmask(SIGQUIT)|sigmask(SIGHUP)); do { pid = waitpid(cur->pid, (int *) &pstat, 0); } while (pid == -1 && errno == EINTER); (void)sigsetmask(omask); } #else /* SYSV */ sigemptyset(&set); sigaddset(&set,SIGINT); sigaddset(&set,SIGQUIT); sigaddset(&set,SIGHUP); sigprocmask(SIG_SETMASK,&set,&omask); do { pid = waitpid(cur->pid, (int *)&pstat, 0); } while (pid == -1 && errno == EINTR); sigprocmask(SIG_SETMASK, &omask,NULL); #endif if (last == NULL){ pidlist = cur->next; } else { last->next = cur->next; } free(cur); return (pid == -1 ? -1 : pstat); }
Month: May 2016
execlp
#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; }