第06章 unix系统编程基础.ppt_第1页
第06章 unix系统编程基础.ppt_第2页
第06章 unix系统编程基础.ppt_第3页
第06章 unix系统编程基础.ppt_第4页
第06章 unix系统编程基础.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一个简单的C程序示例 程序代码 intmain intargc char argv printf HelloLinux n 编译过程 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 printf Thisismytool1print s n print str 文件3 mytool2 cvoidmytool2 print char print str printf Thisismytool2print s n print str 编译和运行 编译 gcc cmain cgcc cmytool1 cgcc cmytool2 cgcc omainmain omytool1 omytool2 o运行 main makefile makemakefilemakeflie文件内容 main main omytool1 omytool2 ogcc omainmain omytool1 omytool2 omain o main cgcc cmain cmytool1 o mytool1 cgcc cmytool1 cmytool2 o mytool2 cgcc cmytool2 c 与进程相关的api pid tgetpid void pid tgetppid void uid tgetuid void uid tgeteuid void gid tgetgid void git tgetegid void getpwuid structpasswd getpwuid uid tuid passwd结构structpasswd char pw name 登录名称 char 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 getuid my euid geteuid my gid getgid my egid getegid my info getpwuid my uid 用户管理示例程序 2 2 printf ProcessID ld n my pid printf ParentID ld n parent pid printf UserID ld n my uid printf EffectiveUserID ld n my euid printf GroupID ld n my gid printf EffectiveGroupID ld n my egid if my info printf MyLoginName s n my info pw name printf MyPassword s n my info pw passwd printf MyUserID ld n my info pw uid printf MyGroupID ld n my info pw gid printf MyRealName s n my info pw gecos printf MyHomeDir s n my info pw dir printf MyWorkShell s n my info pw shell 进程控制相关的API pid tfork pid twait int stat loc pid twaitpid pid tpid int stat loc intoptions exec族API intexecl 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 tchild intstatus printf Thiswilldemostratehowtogetchildstatus n if child fork 1 printf ForkError s n strerror errno exit 1 elseif child 0 inti printf Iamthechild ld n getpid for i 0 i 1000000 i sin i i 5 printf Iexitwith d n i exit i 进程控制示例 1 2 进程控制示例 2 2 while child wait 后台进程示例 Linux的默任个人的邮箱地址是 var spool mail 用户的登录名 defineMAIL var spool mail hoyt 睡眠10秒钟 defineSLEEP TIME10main void pid tchild if child fork 1 printf ForkError s n strerror errno exit 1 elseif child 0 while 1 if kill getppid SIGTERM 1 printf KillParentError s n strerror errno exit 1 intmailfd while 1 if mailfd open MAIL O RDONLY 1 fprintf stderr s 7 close mailfd sleep SLEEP TIME 文件相关的API intopen 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 文件复制示例 defineBUFFER SIZE1024intmain intargc char argv intfrom fd to fd intbytes read bytes write charbuffer BUFFER SIZE char ptr if argc 3 fprintf stderr Usage sfromfiletofile n a argv 0 exit 1 打开源文件 if from fd open argv 1 O RDONLY 1 fprintf stderr Open sError s n argv 1 strerror errno exit 1 创建目的文件 if to fd open argv 2 O WRONLY O CREAT S IRUSR S IWUSR 1 fprintf stderr Open sError s n argv 2 strerror errno exit 1 以下代码是一个经典的拷贝文件的代码 while bytes read read from fd buffer BUFFER SIZE if bytes read 1 取文件的属性 intaccess constchar pathname intmode intstat constchar file name structstat buf intfstat intfiledes structstat buf 文件的属性 structstat dev 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 块数 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 toff intclosedir DIR dir staticintget file size time constchar filename structstatstatbuf if stat filename 目录文件的操作示例 intmain intargc char argv DIR dirp structdirent direntp intstats if argc 2 printf Usage sfilename n a argv 0 exit 1 if stats get file size time argv 1 0 stats 1 exit 1 if dirp opendir argv 1 NULL printf OpenDirectory sError s n argv 1 strerror errno exit 1 while direntp readdir dirp NULL if get file size time direntp d name closedir dirp exit 1 管道文件 intpipe intfildes 2 intdup2 intoldfd intnewfd 管道示例 defineBUFFER255intmain intargc char argv charbuffer BUFFER 1 intfd 2 if argc 2 fprintf stderr Usage sstring n a argv 0 exit 1 if pipe fd 0 fprintf stderr PipeError s n a strerror errno exit 1 if fork 0 close fd 0 printf Child d Writetopipe n a getpid snprintf buffer BUFFER s argv 1 write fd 1 buffer strlen buffer printf Child d Quit n a getpid exit 0 else close fd 1 printf Parent d Readfrompipe n a getpid memset buffer BUFFER 1 read fd 0 buffer BUFFER printf Parent d Read s n getpid buffer exit 1 重定向示例 defineBUFFER SIZE1024intmain intargc char argv intfd charbuffer BUFFER SIZE if argc 2 fprintf stderr Usage soutfilename n a argv 0 exit 1 if fd open argv 1 O WRONLY O CREAT O TRUNC S IRUSR S IWUSR 1 fprintf stderr Open sError s n a argv 1 strerror errno exit 1 if dup2 fd STDOUT FILENO 1 fprintf stderr RedirectStandardOutError s n a 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 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 SIGPWR 产生信号的API intkill pid tpid intsig intraise intsig unisignedintalarm unsignedintseconds 信号的处理方式 默认 大多数情况下 收到信号的进程会结束忽略 忽略收到的信号 就像没有收到一样捕获 收到信号的进程暂停当前执行的语句 转向执行自己定义的一个函数屏蔽 暂时不理睬收到的信号 等到合适的时机再处理 信号的一个简单示例 main unsignedinti alarm 1 for i 0 1 i printf I d i 屏蔽信号的相关API intsigemptyset sigset t set 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 Usage srepeat factor n a argv 0 exit 1 if repeat factor atoi argv 1 1 repeat factor 10 sigemptyset 加入中断Ctrl C信号 while 1 阻塞信号 我们不希望保存原来的集合所以参数为NULL sigprocmask SIG BLOCK 改变信号的处置方式 intsigaction intsigno conststructsigaction act structsigaction oact structsigaction void sa handler intsigno sigset tsa mask intsa flags 捕获信号示例 definePROMPT 你想终止程序吗 char prompt PROMPT voidctrl c op intsigno write STDERR FILENO prompt strlen prompt intmain structsigactionact act sa handler ctrl c op sigemptyset intpause void intsigsuspend constsigset t sigmask intsigsetjmp sigjmp bufenv intval voidsiglongjmp sigjmp bufenv intval 信号原子性问题 检查邮件的后台程序 Linux的默任个人的邮箱地址是 var spool mail defineMAIL DIR var spool mail 睡眠10秒钟 defineSLEEP TIME10 defineMAX FILENAME255unsignedcharnotifyflag 1 longget file size constchar filename structstatbuf if stat filename voidsend mail notify void fprintf stderr Newmailhasarrived7 n voidturn on notify intsigno notifyflag 1 voidturn off notify intsigno notifyflag 0 intcheck mail constchar filename longold mail size new mail size sigset tblockset emptyset sigemptyset while 1 if sigprocmask SIG BLOCK intmain void charmailfile MAX FILENAME structsigactionnewact structpasswd pw if pw getpwuid getuid NULL fprintf stderr GetLoginNameError s n a strerror errno exit 1 strcpy mailfile MAIL DIR strcat mailfile pw pw name newact sa handler turn on notify newact sa flags 0 sigemptyset POSIX无名信号量 intsem init sem t sem intpshared unsignedintvalue 创建一个信号灯 并初始化其值为value pshared决定了信号量能否在几个进程间共享 由于目前Linux还没有实现进程间共享信号灯 所以这个值只能够取0intsem destroy sem t sem 删除信号灯intsem wait sem t sem 阻塞进程 直到信号灯的值大于0intsem trywait sem t sem intsem post sem t sem 1intsem getvalue sem t sem SystemV信号量 key tftok char pathname charproj intsemget key tkey intnsems intsemflg intsemctl intsemid intsemnum intcmd unionsemunarg intsemop intsemid structsembuf spos intnspos structsembuf shortsem num 使用那一个信号 shortsem op 进行什么操作 shortsem flg 操作的标志 用信号量机制解决哲学家进餐问题 definePhNum5 defineLEFT PhNum i 1 PhNum defineRIGHT i 1 PhNum defineTHINKING0 defineHUNGRY1 defineEATING2 defineTHINKTIME4 defineEATTIME3unionsemun intval structsemid ds buf ushort array voiddown op intsid ushortsn structsembufop op sem num sn op sem op 1 op sem flg 0 semop sid voidthink inti printf I mphilosopher d I mthinkingnow n i sleep rand 11 voideat inti printf I mphilosopher d Iwilleat n i sleep rand 11 voidtest inti char state intsid if state i HUNGRY voidtake forks inti char state intsid down op sid PhNum state i HUNGRY printf I mphilosopher d I mhungry CanIeatnow n i test i state sid up op sid PhNum down op sid i voidput forks inti char state intsid down op sid PhNum state i THINKING printf I mphilosopher d myeatingfinished Somyneighbourscaneat n i test LEFT state sid test RIGHT state sid up op sid PhNum voidphilosopher inti char state intsid while 1 think i take forks i state sid eat i put forks i state sid intmain intargc char argv intsemid shmid i pid mynum char state unionsemunse 信号量集合sestructshmid dssid d ushortarray PhNum 1 key tipc key ipc key ftok s 获取一个key t类型的key 创建信号量集合if semid semget ipc key PhNum 1 0600 IPC CREAT 1 perror Semgeterror Createrror exit 1 if shmid shmget IPC PRIVATE PhNum 0600 IPC CREAT 1 创建一块共享内存 用于保存几位哲学家的状态semctl semid 0 IPC RMID se 删除信号量标识关联的信号集合perror Shmgeterror exit 1 设置参数 union 到初始化向量的地址 array PhNum 1 for i 0 i PhNum i array i 0 se array array if semctl semid PhNum 1 SETALL se 1 初始化信号集合se中所有信号量的值semctl semid 0 IPC RMID se 删除信号量标识关联的信号集合shmctl shmid IPC RMID for i 0 i PhNum i state i THINKING initializeallthephilospherarethinking for i 1 i PhNum i while pid fork 1 if pid 子进程mynum i 1 break 回收IPC资源if pid wait NULL semctl semid 0 IPC RMID se shmdt state sh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论