• 操作系统导论

  • 第五章

  • 编码作业作业

categories:

  • 操作系统导论

操作系统导论第五章:进程API

UNIX的系统调用

UNIX采用一对系统调用:fork()函数和exec()函数,非常有趣的创建新进程。

父进程还可以通过第三个系统调用wait(),等待其创建的子进程完成并且回收,注意,子进程不能调用it(),否则wait()函数会返回-1,而父进程调用则会返回子进程的PID。

fork()函数

先贴一段简单的调用fork函数的代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
printf("hello,world.\n");
int x = 100;
int rc = fork();
if(rc<0)
{
fprintf(stderr,"fork failed\n");
exit(1);
}
else if(rc==0)
{
printf("hello,I am child\n");
printf("x=%d\n",x+7);
}
else{
printf("hello,I am parent\n");
printf("x=%d\n",x+8);
}
return 0;
}

运行结果是:

可以看到是各改变各的值,并没有出现叠加的情况,父程序x变为108,子程序变为107a。
说明父子程序的变量x虽然拥有一样的初值,但是他们保存的地址是独立的,不同的,所以他们保存的值也是不同的,也就是他们完全拥有互相独立的数据和地址。
注意,fork函数的返回值父进程返回1,子进程返回0,除此之外,这两个进程完全相同。

exec函数调用

#include<unistd.h>
#include<fcntl.h>
#include<sys/wait.h>
int main()
{

int rc = fork();
if(rc<0)
{
fprintf(stderr,"fork failed\n");
exit(1);
}
else if(rc==0)
{
printf("child\n");
execl("/bin/ls","ls","-l",NULL);
execle("/bin/ls","ls","-l",NULL,NULL);
execlp("/bin/ls","ls","-l",NULL);

char *m[] = {"ls","-l",NULL};
execve("/bin/ls",m,NULL);
execv("/bin/ls",m);
execvp("/bin/ls",m);

exit(1);
}
else{
printf("parent\n");
}
return 0;
}

exec()函数族有六个变体
根据参数类型,大体可以分为两类:
• 以 list 可变参数传参
• execl
• execlp
• execle
• 以 vector 数组传参
• execv
• execvp
• execve
在这里插入图片描述
各个函数变体参数如上。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐