第06章 unix系统编程基础.ppt
《第06章 unix系统编程基础.ppt》由会员分享,可在线阅读,更多相关《第06章 unix系统编程基础.ppt(58页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一个简单的C程序示例程序代码:intmain(intargc,char*argv)printf(HelloLinuxn);编译过程:gcc-ohellohello.c程序的运行./hello多个文件组成的程序文件1:main.cvoidmytool1_print(char*print_str);voidmytool2_print(char*print_str);intmain(intargc,char*argv)mytool1_print(hello);mytool2_print(hello);文件2:mytool1.cvoidmytool1_print(char*print_str)prin
2、tf(Thisismytool1print%sn,print_str);文件3:mytool2.cvoidmytool2_print(char*print_str)printf(Thisismytool2print%sn,print_str);编译和运行编译:gcc-cmain.cgcc-cmytool1.cgcc-cmytool2.cgcc-omainmain.omytool1.omytool2.o运行:./mainmakefilemakemakefilemakeflie文件内容:main:main.omytool1.omytool2.ogcc-omainmain.omytool1.omyt
3、ool2.omain.o:main.cgcc-cmain.cmytool1.o:mytool1.cgcc-cmytool1.cmytool2.o:mytool2.cgcc-cmytool2.c与进程相关的apipid_tgetpid(void);pid_tgetppid(void);uid_tgetuid(void);uid_tgeteuid(void);gid_tgetgid(void);git_tgetegid(void);getpwuidstructpasswd*getpwuid(uid_tuid);passwd结构structpasswdchar*pw_name;/*登录名称*/cha
4、r*pw_passwd;/*登录口令*/uid_tpw_uid;/*用户ID*/gid_tpw_gid;/*用户组ID*/char*pw_gecos;/*用户的真名*/char*pw_dir;/*用户的目录*/char*pw_shell;/*用户的SHELL*/;用户管理示例程序(1/2)intmain(intargc,char*argv)pid_tmy_pid,parent_pid;uid_tmy_uid,my_euid;gid_tmy_gid,my_egid;structpasswd*my_info;my_pid=getpid();parent_pid=getppid();my_uid=g
5、etuid();my_euid=geteuid();my_gid=getgid();my_egid=getegid();my_info=getpwuid(my_uid);用户管理示例程序(2/2)printf(ProcessID:%ldn,my_pid);printf(ParentID:%ldn,parent_pid);printf(UserID:%ldn,my_uid);printf(EffectiveUserID:%ldn,my_euid);printf(GroupID:%ldn,my_gid);printf(EffectiveGroupID:%ldn,my_egid);if(my_inf
6、o)printf(MyLoginName:%sn,my_info-pw_name);printf(MyPassword:%sn,my_info-pw_passwd);printf(MyUserID:%ldn,my_info-pw_uid);printf(MyGroupID:%ldn,my_info-pw_gid);printf(MyRealName:%sn,my_info-pw_gecos);printf(MyHomeDir:%sn,my_info-pw_dir);printf(MyWorkShell:%sn,my_info-pw_shell);进程控制相关的APIpid_tfork();pi
7、d_twait(int*stat_loc);pid_twaitpid(pid_tpid,int*stat_loc,intoptions);exec族APIintexecl(constchar*path,constchar*arg,.);intexeclp(constchar*file,constchar*arg,.);intexecle(constchar*path,constchar*arg,.);intexecv(constchar*path,char*constargv);intexecvp(constchar*file,char*constargv):voidmain(void)pid
8、_tchild;intstatus;printf(Thiswilldemostratehowtogetchildstatusn);if(child=fork()=-1)printf(ForkError:%sn,strerror(errno);exit(1);elseif(child=0)inti;printf(Iamthechild:%ldn,getpid();for(i=0;i0)while(1);if(kill(getppid(),SIGTERM)=-1)printf(KillParentError:%sn,strerror(errno);exit(1);intmailfd;while(1
9、)if(mailfd=open(MAIL,O_RDONLY)!=-1)fprintf(stderr,%s,7);close(mailfd);sleep(SLEEP_TIME);文件相关的APIintopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);intclose(intfd);ssize_tread(intfd,void*buffer,size_tcount);ssize_twrite(intfd,constvoid*buffer,size_tcount);文件复制示例#defi
10、neBUFFER_SIZE1024intmain(intargc,char*argv)intfrom_fd,to_fd;intbytes_read,bytes_write;charbufferBUFFER_SIZE;char*ptr;if(argc!=3)fprintf(stderr,Usage:%sfromfiletofilena,argv0);exit(1);/*打开源文件*/if(from_fd=open(argv1,O_RDONLY)=-1)fprintf(stderr,Open%sError:%sn,argv1,strerror(errno);exit(1);/*创建目的文件*/if
11、(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1)fprintf(stderr,Open%sError:%sn,argv2,strerror(errno);exit(1);/*以下代码是一个经典的拷贝文件的代码*/while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)if(bytes_read=-1)&(errno!=EINTR)break;/*发生了错误*/elseif(bytes_read0)ptr=buffer;while(bytes_write=write(to_fd,ptr,byt
12、es_read)if(bytes_write=-1)&(errno!=EINTR)break;/*发生了错误*/elseif(bytes_write=bytes_read)break;/*写完了所有读的字节*/elseif(bytes_write0)/*只写了一部分,继续写*/ptr+=bytes_write;bytes_read-=bytes_write;if(bytes_write=-1)break;/*发生了错误*/close(from_fd);close(to_fd);exit(0);取文件的属性intaccess(constchar*pathname,intmode);intstat
13、(constchar*file_name,structstat*buf);intfstat(intfiledes,structstat*buf);文件的属性structstatdev_tst_dev;/*设备*/ino_tst_ino;/*节点*/mode_tst_mode;/*模式*/nlink_tst_nlink;/*硬连接*/uid_tst_uid;/*用户ID*/gid_tst_gid;/*组ID*/dev_tst_rdev;/*设备类型*/off_tst_off;/*文件字节数*/unsignedlongst_blksize;/*块大小*/unsignedlongst_blocks;
14、/*块数*/time_tst_atime;/*最后一次访问时间*/time_tst_mtime;/*最后一次修改时间*/time_tst_ctime;/*最后一次改变时间(指属性)*/;目录文件的操作char*getcwd(char*buffer,size_tsize);intmkdir(constchar*path,mode_tmode);DIR*opendir(constchar*path);structdirent*readdir(DIR*dir);voidrewinddir(DIR*dir);off_ttelldir(DIR*dir);voidseekdir(DIR*dir,off_t
15、off);intclosedir(DIR*dir);staticintget_file_size_time(constchar*filename)structstatstatbuf;if(stat(filename,&statbuf)=-1)printf(Getstaton%sError:%sn,filename,strerror(errno);return(-1);if(S_ISDIR(statbuf.st_mode)return(1);if(S_ISREG(statbuf.st_mode)printf(%ssize:%ldbytestmodifiedat%s,filename,statbu
16、f.st_size,ctime(&statbuf.st_mtime);return(0);目录文件的操作示例intmain(intargc,char*argv)DIR*dirp;structdirent*direntp;intstats;if(argc!=2)printf(Usage:%sfilenamena,argv0);exit(1);if(stats=get_file_size_time(argv1)=0)|(stats=-1)exit(1);if(dirp=opendir(argv1)=NULL)printf(OpenDirectory%sError:%sn,argv1,strerro
17、r(errno);exit(1);while(direntp=readdir(dirp)!=NULL)if(get_file_size_time(direntp-d_name)closedir(dirp);exit(1);管道文件intpipe(intfildes2);intdup2(intoldfd,intnewfd);管道示例#defineBUFFER255intmain(intargc,char*argv)charbufferBUFFER+1;intfd2;if(argc!=2)fprintf(stderr,Usage:%sstringna,argv0);exit(1);if(pipe(
18、fd)!=0)fprintf(stderr,PipeError:%sna,strerror(errno);exit(1);if(fork()=0)close(fd0);printf(Child%dWritetopipena,getpid();snprintf(buffer,BUFFER,%s,argv1);write(fd1,buffer,strlen(buffer);printf(Child%dQuitna,getpid();exit(0);elseclose(fd1);printf(Parent%dReadfrompipena,getpid();memset(buffer,BUFFER+1
19、);read(fd0,buffer,BUFFER);printf(Parent%dRead:%sn,getpid(),buffer);exit(1);重定向示例#defineBUFFER_SIZE1024intmain(intargc,char*argv)intfd;charbufferBUFFER_SIZE;if(argc!=2)fprintf(stderr,Usage:%soutfilenamena,argv0);exit(1);if(fd=open(argv1,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR)=-1)fprintf(stderr,Open
20、%sError:%sna,argv1,strerror(errno);exit(1);if(dup2(fd,STDOUT_FILENO)=-1)fprintf(stderr,RedirectStandardOutError:%sna,strerror(errno);exit(1);fprintf(stderr,Now,pleaseinputstring);fprintf(stderr,(ToquituseCTRL+D)n);while(1)fgets(buffer,BUFFER_SIZE,stdin);if(feof(stdin)break;write(STDOUT_FILENO,buffer
21、,strlen(buffer);exit(0);unix中的信号1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGIO30
22、)SIGPWR产生信号的APIintkill(pid_tpid,intsig);intraise(intsig);unisignedintalarm(unsignedintseconds);信号的处理方式默认:大多数情况下,收到信号的进程会结束忽略:忽略收到的信号,就像没有收到一样捕获:收到信号的进程暂停当前执行的语句,转向执行自己定义的一个函数屏蔽:暂时不理睬收到的信号,等到合适的时机再处理信号的一个简单示例main()unsignedinti;alarm(1);for(i=0;1;i+)printf(I=%d,i);屏蔽信号的相关APIintsigemptyset(sigset_t*set
23、);intsigfillset(sigset_t*set);intsigaddset(sigset_t*set,intsigno);intsigdelset(sigset_t*set,intsigno);intsigismember(sigset_t*set,intsigno);intsigprocmask(inthow,constsigset_t*set,sigset_t*oset);信号屏蔽示例intmain(intargc,char*argv)doubley;sigset_tintmask;inti,repeat_factor;if(argc!=2)fprintf(stderr,Usag
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第06章 unix系统编程基础 06 unix 系统 编程 基础
限制150内