linux系统编程实验_第1页
linux系统编程实验_第2页
linux系统编程实验_第3页
linux系统编程实验_第4页
linux系统编程实验_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux Linux 系统编程系统编程实验实验 linuxlinux系统编程系统编程LinuxLinux下下C C语言编程方法语言编程方法1 1、编译方法、编译方法 例如一个例如一个hello.chello.c的程序的程序 gcc gcc o hello hello.c o hello hello.c2 2、运行方法、运行方法 在当前目录下敲入在当前目录下敲入 Hello Hello 或者或者 ./ ./hello ./hello ./表示当前目录表示当前目录实验实验 linuxlinux系统编程系统编程一一 进程的基本介绍进程的基本介绍1 11 1、取得进程、取得进程PCBPCB的标识的标

2、识 getpidgetpid()() getppidgetppid() ()2 2、创建进程、创建进程 fork() exec()fork() exec()3 3、进程的同步进程的同步 wait()wait()4 4、进程的终止进程的终止 exit() exit() 实验实验 linuxlinux系统编程系统编程进程进程PCBPCB的标识的标识getpid的作用很简单,就是返回当前进程的进程的作用很简单,就是返回当前进程的进程ID,请大家看以下的例子:请大家看以下的例子:# #include /include /* * 提供类型提供类型pidpid_t _t的定义的定义 * */ / # #i

3、ncludeinclude /.h /* * 提供函数的定义提供函数的定义 * */ / pidpid_t _t getpid getpid(void); (void); Int getpidInt getpid(void); (void); 同理同理getppidgetppid() ()/ /* * getpidgetpid_test.c _test.c * */ / # #includeinclude /.h /* * 提供函数的定义提供函数的定义 * */ / Main()Main() printfprintf(“ my parent ID is:%dn”,(“ my parent ID

4、 is:%dn”,getppidgetppid();(); printfprintf(“my ID is:%dn”,(“my ID is:%dn”,getpidgetpid();(); 实验实验 linuxlinux系统编程系统编程创建进程创建进程fork命令命令fork系统调用的作用是复制一个系统调用的作用是复制一个子子进程。当一个进程调用进程。当一个进程调用fork后后,完成后就出现两个,完成后就出现两个几乎几乎一模一样的进程一模一样的进程(克隆克隆)。)。先看如下例子先看如下例子/ /* * fork_test1.c fork_test1.c * */ /的运行结果:的运行结果:# #i

5、nclude /include /* * 提供类型提供类型pidpid_t _t的定义的定义 * */ / # #includeinclude /.h /* * 提供函数的定义提供函数的定义 * */ / pidpid_t fork(void); _t fork(void); Int getpidInt getpid(void); (void); # #includeinclude /.h /* * 提供函数的定义提供函数的定义 * */ / Main()Main() int pidint pid; ; printfprintf(“onen”);(“onen”); pidpid=fork();

6、=fork(); printfprintf(“my ID is:%dn”,(“my ID is:%dn”,getpidgetpid();(); 实验实验 linuxlinux系统编程系统编程Printf(“onen”);Pid=fork();Printf(“twon”);输出字符输出字符“one”A进程fork创建子进程后创建子进程后,父子进程在内父子进程在内存不同的地方。代码完全一样,存不同的地方。代码完全一样,克隆人。并且克隆人。并且pc指针指向指针指向fork后后的下一个操作的下一个操作(赋值赋值)。Pid的值在父的值在父子进程中的值不相同。子进程中的值不相同。Printf(“onen”

7、);Pid=fork();Printf(“twon”);A进程(父)Printf(“onen”);Pid=fork();Printf(“twon”);B进程(子)Pid0Pid=0父子进程的区别除了进程标志符父子进程的区别除了进程标志符pID不同不同外,变量外,变量pid的值也不相同,的值也不相同,pid存放的存放的是是fork的返回值。的返回值。fork调用的一个奇妙调用的一个奇妙之处就是它仅仅被调用一次,却能够返回之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:两次,它可能有三种不同的返回值:1.在父进程中,fork返回新创建子进程的进程ID; 2.在子进程中,fork

8、返回0; 3.如果出现错误,fork返回一个负值;实验实验 linuxlinux系统编程系统编程/ /* * fork_test2.c fork_test2.c * */ / #include#include # #inlcudeinlcude .h main() main() pid pid_t _t pid pid; ; / /* *此时仅有一个进程此时仅有一个进程* */ / pidpid=fork();=fork(); / /* *此时已经有两个进程在同时运行此时已经有两个进程在同时运行* */ / if(if(pidpid0) 0) printf printf(error in fo

9、rk!);(error in fork!); else if( else if(pidpid=0) =0) printf printf(I am the child , my process ID is %dn,(I am the child , my process ID is %dn,getpidgetpid();(); else else printf printf(I am the parent, my process ID is %dn,(I am the parent, my process ID is %dn,getpidgetpid();(); 实验实验 linuxlinux系

10、统编程系统编程思考如下两个程序,判别总共有多少并发进程?能否画出其进思考如下两个程序,判别总共有多少并发进程?能否画出其进程的家族图程的家族图Main()Main()fork();fork(); fork(); fork(); fork(); fork(); Main()Main() for(;) fork();for(;) fork(); Main()Main() fork(); fork(); fork(); fork(); 实验实验 linuxlinux系统编程系统编程创建进程创建进程execl命令命令ForkFork程序只能赋值一个副本,而程序只能赋值一个副本,而execexec可以运

11、行一个新的程可以运行一个新的程序,并覆盖原先调用的程序空间。序,并覆盖原先调用的程序空间。# #includeinclude /.h /* * 提供函数的定义提供函数的定义 * */ / Int execlInt execl(const char (const char * *path,const char path,const char * *argarg_i,(char _i,(char * *)0);)0);ExeclExecl(“ (“新程序路径新程序路径”,“新程序名新程序名”,参数,参数,( (char char * *)0);)0);# #includeinclude /.h /

12、* * 提供函数的定义提供函数的定义 * */ / Main()Main() printfprintf(“Ready to executing (“Ready to executing ls lsn”);n”); execlexecl(“/bin/(“/bin/ls ls”,”,”ls ls”,”-l”,(char ”,”-l”,(char * *)0);)0); 例如:例如:execlexecl_test.c_test.c实验实验 linuxlinux系统编程系统编程ExeclExecl的功能:的功能:装载一个新的程序装载一个新的程序, ,并将之转换到调用进程的内存空间。并将之转换到调用进程

13、的内存空间。如果调用成功,调用程序将被新的程序完全覆盖,并从新程序如果调用成功,调用程序将被新的程序完全覆盖,并从新程序的起始处开始执行。的起始处开始执行。结果可以认为是创建一个新的进程,但是进程结果可以认为是创建一个新的进程,但是进程PIDPID和原来的进和原来的进程相同。程相同。Main()Printf(“.”);Execl(“/bin/.);原进程空间Ls的程序代码的程序代码新进程空间实验实验 linuxlinux系统编程系统编程思考如下的例子,思考如下的例子,/ /* * fork_fork_execlexecl.c .c * */ / # #inlcudeinlcude .h mai

14、n() main() int pidint pid; ; pidpid=fork();=fork(); switch( switch(pidpid) ) case 1: case 1: printfprintf(“fork error!n”); break;(“fork error!n”); break; case 0 : case 0 : execlexecl(“/bin/(“/bin/ls ls”,”,”ls ls”,”-l”,(char ”,”-l”,(char * *)0);break;)0);break; default: default:printfprintf(“this is

15、parent doing something”);exit(0);(“this is parent doing something”);exit(0); 实验实验 linuxlinux系统编程系统编程进程同步进程同步- -waitwait()()有时候我们希望子进程继续执行,而父进程阻塞(等待)直到有时候我们希望子进程继续执行,而父进程阻塞(等待)直到子进程完成任务。这个时候我们可以调用子进程完成任务。这个时候我们可以调用wait.wait.waitwait系统调用会使父进程阻塞直到某一个子进程结束或者是系统调用会使父进程阻塞直到某一个子进程结束或者是父进程接受到了一个信号。如果父进程没有子进

16、程或者他的子父进程接受到了一个信号。如果父进程没有子进程或者他的子进程已经结束了进程已经结束了waitwait回立即返回回立即返回成功时成功时( (因一个子进程结束因一个子进程结束) )waitwait将返回子进程的将返回子进程的IDID,否则返否则返回回-1-1# #includeinclude /.h /* * 提供函数的定义提供函数的定义 * */ / # #include /include /* * 提供提供pidpid_t _t的定义的定义 * */ /PidPid_t wait(_t wait(int int * *status);status);实验实验 linuxlinux系统

17、编程系统编程/ /* * wait_test.c wait_test.c * */ / #include#include.h#include#include main() main() int pidint pid, ,wpidwpid; ; pidpid=fork();=fork(); if( if(pidpid=0=0) printfprintf(“this is child,my id is:%dn”,(“this is child,my id is:%dn”,gepidgepid();sleep(4);();sleep(4); else if( else if(pidpid0)0) wpidwpid=wait(0);=wait(0); printfprintf(“child %d is right,now I will continue.n”,(“child %d is right,now I will continue.n”,wpidwpid); ); exit(0); exit(0); 实验实验 linuxlinux系统编程系统编程进程结束函数进程结束函数exitexitExit(0) Exit(0) 正常结束正常结束Exit(1) Exit(1) 非正常结束非正常结束实验实验 linuxlinux系统编程系统编程二二 进程的进程的“软中断软中断”通信通信用于同一用

温馨提示

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

评论

0/150

提交评论