UNIX下C语言编程技术交流.ppt
《UNIX下C语言编程技术交流.ppt》由会员分享,可在线阅读,更多相关《UNIX下C语言编程技术交流.ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、二、二、UNIX下下C编程基础编程基础ObjectivesObjectives学习完本章以后,我们应该了解如下内容:1)UNIX下C编程的常见类型2)常用的系统调用和库函数3)了解UNIX编程的基本概念:文件操作、进程控制、信号、信号灯、共享内存、消息队列、SOCKET通信、4)了解curses编程接口。5)了解Pro*C编程接口 二、二、UNIX下下C编程基础编程基础 文件用户角度文件编码普通文件设备文件ASCII/文本文件二进制文件/流式文件普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。设
2、备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等 文件I/O 二、二、UNIX下下C编程基础编程基础 文件指针:在语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可以对它所指的 文件进行打开、关闭、读、写、定位等各种操作。说明文件指针的一般形式为:FILE *指针变量标识符;其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。常用缓冲文件系统函数 名称功能名称功能名称功能fopen()打开一个文件fputs()写串到文件rewind()把文件定位指示置回文件头fclose()关闭一个文件fseek()在文件中
3、定位特定字节remove()删除一个文件putc()向文件中写入一个字符ftell()返回当前文件位置fflush()请缓冲fputc()与putc()相同fprintf()与文件的关系如同printf和控制台的关系getc()从文件中读取一个字符fscanf()与文件的关系如同scanf和控制台的关系fgetc()与getc()相同feof()到达文件尾时返回truefgets()从文件中读一字串ferror()发生错误是返回true方式意义方式意义r只读打开一个文本文件,只允许读数据 w+读写打开或建立一个文本文件,允许读写 w只写打开或建立一个文本文件,只允许写数据 a+读写打开一个文本
4、文件,允许读,或在文件末追加数据a追加打开一个文本文件,并在文件末尾写数据 r+b读写打开一个二进制文件,允许读和写 rb只读打开一个二进制文件,只允许读数据 w+b读写打开或建立一个二进制文件,允许读和写wb只写打开或建立一个二进制文件,只允许写数据 a+b读写打开一个二进制文件,允许读,或在文件末追加数据ab追加打开一个二进制文件,并在文件末尾写数据 r+读写打开一个文本文件,允许读和写 文件I/O 二、二、UNIX下下C编程基础编程基础 1、使用fopen()、getc()、putc()和fclose()/*this is a test for file I/O use function
5、 fopen(),getc(),putc()and fclose()*/#include stdio.h.#include void main(int argc,char*argv)FILE*fp;char ch;if(argc!=2)printf(“please enter filename.n”);exit(1);If(fp=fopen(argv1,”w”)=NULL)printf(“cant open file.n”);exit(1);do ch=getchar();putc(ch,fp);while(ch!=#);fclose(fp);return;文件I/O 二、二、UNIX下下C编
6、程基础编程基础/*feof sample*/#include stdio.h.#include void main(int argc,char*argv)FILE*in,*out;char ch;while(!feof(in)ch=getc(in);putc(ch,out);fclose(in);fclose(out);return;/*ferror sample */#include stdio.h.#include void main(int argc,char*argv)FILE*in,*out;char ch;while(!feof(in)ch=getc(in);if(ferror(i
7、n)printf(“read file errorn”);break;putc(ch,out);fclose(in);fclose(out);return;2、文件检测函数feof()、ferror()文件I/O 二、二、UNIX下下C编程基础编程基础信号的概念 信号是送到进程的“软中断”,它通知进程在它们的环境中出现了非正常的事件,进程可以进行相应的处理。信号可由进程发出,也可由终端或内核发出,大多数标准的UNIX信号使得一个进程在它收到信号时终止进程。信号一般是异步发生的。信号的传递方式如下:1)一个进程发给另一个进程;2)内核发给进程。每个信号都有一个名字,定义在中。1)系统调用kill
8、允许一个进程把信号传给另一个进程或本身。为了发送信号,发送进程和接收进程必须有相同的有效用户号或发送进程有超级用户特权,系统调用kill的形式如下:intkill(shortpid,intsig);第一个参数指出接收信号的进程的进程ID;第二个参数是一个信号值。a、参数pid=0,信号发送给发送进程组中的所有进程。b、pid=-1,发送进程非超级用户,信号发送给所有实际用户号等于发送进程有效用户号的进程;c、pid=-1,发送进程是超级用户,则信号发送给除系统进程外的所有其它进程。d、pid为负数且不等于-1,则信号发送给所有进程组号为pid绝对值的进程;e、参数sig=0,则不发送信号只做错
9、误检测,此选项用来测试进程号的有效性。信号产生的5个条件2、kill命令也可用来发送信号。上述各选项也适用于此命令。3、特定的终端字符也会产生信号,如ctl-c或Delete、ctl-y、ctl-z。这些 由终端产生的信号不只是发给正在运行的进程,也发给所有终端控制组 中的进程,一般由内核发给进程。4、一定的硬件条件也产生信号。比如浮点算术错产生信号SIGPE。5、一定的软件条件也产生信号 信号二、二、UNIX下下C编程基础编程基础信号的处理 忽略信号:除信号SIGKILL、SIGSTOP外,所有其它信号皆可忽略;这使得操作系统停止输送信号到进程。捕捉信号:这也就是对应于捕获到一个信号,包含把
10、一个用户提供的过程告诉操作系统在信号到达时进程的执行转到某个函数,而当函数返回时返回到它被调用的那个位置。信号默认动作:系统为每种信号规定了一个默认的动作,这个默认的动作是由UNIX内核来完成。5中可能的默认动作:1)流产 2)终止 3)忽略 4)挂起 5)继续 信号的分类:1)程序错误类信号 2)程序终止类信号 3)时钟信号类信号 4)异步I/O类信号 5)作业控制类信号 6)操作错误类信号 7)其他信号 信号二、二、UNIX下下C编程基础编程基础1)程序错误类信号 SIGABRT:调用abort()函数产生。SIGFPE:算术异常 SIGILL:执行了非法硬件指令或企图执行特权指令。经过编
11、译器生成的可执行文件只包含合法指令,出现这种情 况一般是因为可执行文件造到破坏或函数指针类型的对象赋予了非法值。SIGBUS:总线错误 SIGSYS:非法的系统调用。2)程序终止类信号 SIGHUP:进程挂起 SIGINT:终端的中断键被按下(如Ctrl-c)SIGKILL:致命的中断(不可以被忽略,也不可以被阻塞)。SIGQUIT:当我们按下终端结束键的时候会出现这种情况。SIGTERM:是一个使程序终止的普通信号。3)时钟类信号 SIGALRM:时钟到期(如用alarm()设定的时间到期)SIGPROF:当前进程用去的CPU时间+系统为该进程服务用去的时间到期。SIGVTALRM:当前进程
12、用去的CPU时间到期。信号二、二、UNIX下下C编程基础编程基础4)I/O类信号 SIGIO SIGPOLL SIGURG 这些信号的默认动作是忽略他们。5)作业控制类信号 SIGCHLD:只要进程终止或停止就会向其父进程发送这个信号。SIGCONT:恢复被挂起的进程 SIGSTOP:停止一个进程。6)操作错误类信号 SIGPIPE:该信号指出管道破裂 SIGXFSZ:当进程企图扩大文件以至于超过文件大小限制时出现这个信号。7)其他信号 SIGUSR1,SIGUSR2:用户自己定义的信号 信号二、二、UNIX下下C编程基础编程基础信号的操作 signal函数:通过调用signal来确定怎样处理
13、一个信号,调用形式如下:#include void (*signal(int sig,void(*func)(int)(int);signal函数的功能是为信号sig建立func指定的动作。func 指明信号sig发生时可以采取的3种动作之一:1)SIG_DFL:表示信号以缺省的方式处理;2)SIG_IGN:表示忽略信号的处理。3)信号句柄地址:信号捕获函数。信号二、二、UNIX下下C编程基础编程基础一个简单的例子#include#include static void sig_usr(int);int main()if(signal(SIGUSR1,sig_usr)=SIG_ERR)prin
14、tf(无法捕获信号一n);if(signal(SIGUSR2,sig_usr)=SIG_ERR)printf(无法捕获信号二n);for(;)pause();static void sig_usr(int signo)if(signo=SIGUSR1)printf(捕获到一了,呵呵n);if(signo=SIGUSR2)printf(捕获到二了,呵呵n);return;信号二、二、UNIX下下C编程基础编程基础信号的操作 sigaction函数:该函数与signal有基本相同的作用,但它比signal可靠,而且还提供了对信号更多的控制能力#include int sigaction(int s
15、ig,const struct sigaction*act,struct sigaction*oact);sig用来指定信号 act 和oact 都是指向类型为 sigaction结构的指针。如果act不为NULL,则指向规定信号动作的一个结构,否则,函数调用不改变信号的动作,但可以用来查询当前信号的动作。如果oact不为NULL,系统将返回先前与该信号相联系的动作于oact所指的位置。返回值:成功为0,失败则不执行新的信号动作,并返回-1。数据结构sigaction用来描述信号的动作,它定义在signal.h文件中:struct sigaction void(*sa_handler)();v
16、oid(*sa_sigaction)(int,siginfo_t*,void*);sigset_t sa_mask;int sa_flag;信号二、二、UNIX下下C编程基础编程基础 说明:sa_handler:与signal函数的第二个参数func相同,它指向与信号相联系的动作。sa_sigaction:指定一个信号句柄地址。仅当sa_flags中设置了sa_siginfo 标志时才起作用。sa_mask:如果sa_handler指定一信号句柄,则sa_mask指明信号句柄执行期间要阻塞的一组信号。sa_flags:它可以被设置成如下几个标志值。SA_NOCLDSTOP,此标志只对SIGCH
17、LD信号起作用。如果设置该标志位且sig参数是SIGCHLD,则子进程暂停时不发信号给调用进程。SA_RESTART,如果设置了该位并且被捕获的话,系统将在信号句柄返回时自动恢复该信号中断的系统调用。否则返回-1。SA_ONSTACK,如果设定,系统将在用sigalstack函数指定的替代信号栈上运行信号句柄。否则将使用用户栈来交付信号。SA_RESETHAND,如果设定,系统信号句柄的入口,系统将重新设置信号动作为SIG_DFL.SA_NODEFER,如果设定,在信号句柄执行期间系统不自动阻塞该信号。SA_SIGINFO,如果为设置该标志,则信号句柄的原形为:void func(int si
18、gno);此时sa_handler成员必须指向信号句柄并禁止修改sa_sigaction成员。否则 void func(int signo,siginfo*info,void*context);第二个参数指向siginfo_t的对象,解释信号生成的原因。第三个参数指向当信号被交付时所中断的接收进程的上下文。信号二、二、UNIX下下C编程基础编程基础 注意:掌握如下几点 1)同signal一样,sigaction函数允许进程指定对某种信号采取相应的动作。但与signal不同的是,当我们调用Sigaction来安装信号句柄时,除非明确的采用sa_flags指明SA_RESETHAND标志,否则该句
19、柄将一直保持下去,直到下一次调用sigactioin为这个信号重新安装动作。2)sigaction提供了对信号的更多控制。信号忽略信号例如:下面进程忽略中断信号,按中断键将不起作用(使用退出键可结束运行该进程)#includemain()signal(SIGINT,SIG_IGN);pause();二、二、UNIX下下C编程基础编程基础 信号常用的信号函数二、二、UNIX下下C编程基础编程基础 1)生成信号#include int raise(ing sig);/发送信号sig给调用它的进程。2)kill函数#include int kill(pid_t pid,int sig);/发送信号给
20、一个进程。3)等待信号#include int pause(void);/悬挂进程直到有一个信号到达。4)检查悬挂信号#include int sigpending(sigset_t*set);。信号二、二、UNIX下下C编程基础编程基础进程标识 每个进程都有一个唯一的非负的ID号。进程ID 为 0 0 的进程称为调度进程。该进程并不执行磁盘上的任何程序-它是内核的一部分,因此也叫系统进程。进程ID 为 1 1 的进程通常是init进程。在系统自举结束后由内核调用(/etc/init;/sbin/init),该进程负责在内核自举后启动一个UNIX系统,init通常调用与系统有关的初始化文件/e
21、tc/rc.*,并将系统引导到一个状态(如多用户状态、但用户状态)。进程ID 为 2 2 的进程一般称为页精灵进程(pagedaemon)。此进程负责处理虚存系统的请页操作。与进程ID有关的常用系统调用#include#include pid_t getpid(void)返回:调用进程的进程ID pid_t getppid(void)返回:调用进程的父进程ID uid_t getuid(void)返回:调用进程的实际用户 uid_t geteuid(void)返回:调用进程的有效用户ID gid_t getgid(void)返回:调用进程的实际组 gid_t getegid(void)返回:调
22、用进程的有效组 进程控制二、二、UNIX下下C编程基础编程基础系统调用 fork Unix系统中,新进程被创建的唯一方式是已经存在的进程执行如下fork调用:pid_t fork();在执行时,fork将产生一份当前进程的拷贝。同时带有自己的数据空间(例如,如果一个进程修改一个变量,它不会影响在其他进程中的变量),同时这两个进程将分别被执行。执行调用的进程称为父进程,新的进程称为子进程。如果调用失败,则返回-1。fork调用执行一次返回两次(一次在父进程中返回,一次在子进程中返回),返回值的唯一区别是父进程中返回子进程的进程号,而子进程的返回值为零。若子进程想获等于父进程的进程号,只需调用ge
23、tppid()。fork调用的一个重要特点是父进程打开的文件与子进程共享,这样为父进程把它打开的文件或设备传给子进程提供了方便。调用fork之后父进程关闭为子进程打开的文件以便两者不共享相同的文件。子进程继承父进程的以下进程变量子进程继承父进程的以下进程变量实际用户号;实际用户组号;有效用户号;有效用户组号;终端组号;根目录;当前工作目录;信号处理设置;文件方式创建掩码.子进程不同于父进程的地方如下子进程不同于父进程的地方如下子进程有一新的进程号;子进程有一不同于父进程的进程号;子进程有它自己的父进程文件描述符副本;在子进程中报警时钟产生的时间量为零.fork调用有以下两个用途1进程创建自己的
24、子进程以便两个进程分别处理两个不同的任务;1进程执行另外一个进程。由于创建新进程的唯一方式是调用fork函数,进程为了执行一新进程必须先调用fork函数创建自己的一个副本,然后由其中某一个进程调用exec函数以执行新进程。进程控制二、二、UNIX下下C编程基础编程基础系统调用 exec Unix系统中程序执行的唯一方式是一个已存在的进程执行exec系统调用。exec系统调用以新程序代替当前进程,进程号不变。我们把执行exec的进程称为调用进程,被加载执行的程序称为新程序。当一个exec执行成功时,调用进程被新程序所覆盖,也就是被调用者所使用的内存被释放,同时新和程序装进该区域。这意味着一旦ex
25、ec执行,对于调用进程是没有返回的,它永远退出了。所有打开的文件依然被打开并由相同的文件描述字所对应,除非一个文件描述字建立了“在执行中关闭”的标志。被调用进程所忽略的信号在新程序中将依然被忽略。然而,被捕捉的信号将恢复到它们的缺省值。调用进程的实际和有效的用户ID和组ID被赋给新的程序,除非新程序建立了“设置用户ID”和“设置组ID”。如果调用失败了,则返回-1。六个不同的exec调用函数1)intexecve(char*pathname,char*argv,char*envp);第一个参数包含将被执行的程序的路径名;第二个参数是一个指向参数列的指针;第三个参数是指向环境变量的指针。调用的这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UNIX 语言 编程 技术交流
限制150内