操作系统实验三
实验二 Linux进程控制
一(实验目的
1. 掌握进程的概念,明确进程和程序的区别。
2. 认识和了解并发执行的实质。
3. 了解Linux系统下进程创建的原理及方法。
三(实验内容
1. 编写一段程序,使用系统调用fork()创建两个子进程。各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。多次运行观察显示结果,并分析产生这种执行效果的原因。
2. 修改上面编写的程序,将每个进程的输出由单个字符改为循环输出一句话,如父进程显示:“parent:”加上进程ID,子进程分别显示:“Child1:”(或“Child2:”)加上自己的进程ID。再多次运行观察程序执行时屏幕上出现的现象,并分析原因。
3.一个父进程创建一个子进程,子进程通过exec系统调用执行另一个文件。各自的代码中显示不同的信息,从其运行结果可看出两个进程并发执行的效果。
4. 编写程序创建如图所示的进程树,在每个进程中显示当前进程ID和父进程ID。
四(实验指导
1. gcc编译器
GNU C 编译器(GCC)
gcc [options] [filenames]
不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名
, gcc test.c 将在当前目录下产生一个叫a.out 为a.out 的可执行文件. 例如
的文件:
用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out: gcc -o count count.c
注意: 当你使用 -o 选项时, -o 后面必须跟一个文件名.
2. Linux进程创建相关的系统调用
(1)fork( )
创建一个新的子进程。其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码、组代码、环境变量、已打开的文件代码、工作目录和资源限制。
系统调用格式: int fork()
如果Fork成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果fork失败则直接返回-1。
(2)getpid()
取得目前进程的识别码(进程ID),许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
系统调用格式: int getpid()
例如:#include
main()
{printf(“pid=%d\n”,getpid());}
(3)getppid
取得目前进程的父进程识别码。
系统调用格式: int getppid() 例如:#include
main()
{printf(“My parent’s pid=%d\n”,getppid());} (4)exec系统调用
#include
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]); int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
在以上六个exec函数中,第一个参数如果为pathname,说明被执行程序是由路径名指定,如果为filename,则说明是由文件名指定;第二个参数如果为数组,说明被执行程序的参数是由一个数组来索引(数组必须含有一个空指针来表示结束),否则需要将参数一一列出;execle()及execve()的envp指针数组表示这两个函数显示指定一个环境表(这个数组必须以一个空指针结束),而另外四个函数则用外部变量environ的当前值来创建一个环境表传递给新程序。
int execl(const char* fullpath, const char* arg, ....)
使用范例:execl(“/bin/ls”, ”ls”, ”-al”, NULL)
int execlp(const char* file, const char* arg, ....)
使用范例:execlp(“ls”, ”ls”, ”-al”, NULL)
int execle(const char* fullpath, const char* arg, ...., char* const envp[])
使用范例:execle(“/bin/ls”, ”ls”, ”-al”, NULL, environ)
int execv(const char * fullpath, char* const argv[])
使用范例:execle(“/bin/mkdir”, argv) // int main(int argc, char* argv[])
或
char* const p[] = {"a.out", "testDir", NULL};
execv("/bin/mkdir", p);
int execvp(const char* file, const char* arg, ....)
使用范例:execlp(“ls”, argv) // int main(int argc, char* argv[])
或
char* const p[] = {"a.out", "testDir", NULL};
execvp("mkdir", p);
int execve(const char* fullpath, const char* arg, ...., char* const envp[])
使用范例:execve(“/bin/ls”, argv, environ)
或
char* const p[] = {"a.out", "testDir", NULL};
execve("/bin/mkdir", p);
3(进程创建程序实示例:
#include
main()
{ int p1;
while((p1=fork())= = -1);
if(p1= =0)
printf(“This is a child process.”); /*在子进程中*/
else /*在父进程中*/
{
Printf(“This is a parent process.”);
}
}
本文档为【操作系统实验三】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。