一、实验内容
学会通过基本的Linux进程控制函数,由父进程创建子进程,并实现协同工作。
创建两个进程,让子进程读取输入,父进程等待子进程读完文件后继续执行,输出子进程的输入。
二、相关知识
1、进程
(1)、进程的概念:进程是程序的一次执行,该程序可与其他程序并发执行;它是一个动态实体,在传统的操作系统设计中,进程既是基本的分配单元,也是基本的执行单元。
(2)、进程的组成:进程由程序段、数据段、工作区及进程控制块(PCB,Process Control Block)组成。进程的程序部分描述了进程所要完成的功能;数据部分是进程执行所需要的数据;工作区是指参数传递和系统调用时的执行环境;进程控制块是操作系统用来记录进程详细状态和相关信息的基本数据结构,它和进程是一一对应的,是进程的唯一标识。
PCB主要包含以下三类:进程的标识信息(进程标识符PID,Process Identification)、现场信息和控制信息。其中进程标识符是进程的代号,每个进程有唯一的PID编号,它是进程运行时系统分配的,在进程终止时被系统回收。
(3)、父进程与子进程的关系:
父进程执行fork()系统调用,生成子进程。子进程复制父进程运行的全部资源,二者可并发执行。一个子进程有唯一的父进程,一个父进程可能有多个子进程。
2、相关Linux进程控制函数
(1)、进程创建函数fork()
函数头文件及原型:
#include <unistd.h>
pid_t id=fork();
从已存在的进程中创建一个新进程,新进程为子进程,原进程为父进程。
fork函数返回值:子进程返回0;父进程返回子进程pid,子进程创建失败返回-1。
(2)、进程终止函数exit()
(3)、进程等待wait();
函数头文件及原型:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
参数:获取的子进程退出码,不关心可设为NULL。
成功返回被等待进程pid, 失败返回-1。
Wait函数传出参数status保存进程的退出状态,WIFEXITED(status):查看进程是否正常退出,若此值为非0,表明进程正常退出。可用WEXITSTATUS(status)获取进程的退出状态(exit时参数)。如:
if(WIFEXITED(status)){
printf("退出值为 %d\n", WEXITSTATUS(status));
}
三、源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(){
pid_t id=fork();//create child progress
if(id<0){
printf("fork error\n");
}
else if(id==0){
//child progress
printf("I am child progress,my pid is %d,ppid is %d\n",getpid(),getppid());
sleep(1);
printf("please enter what you want to type:\n");
FILE *fp;
if((fp=fopen("lab1.txt","w+"))==NULL){
fprintf(stdout,"Can't open \"lab1\" file.\n");
exit(EXIT_FAILURE);
}
char buf[100]={0};
fgets(buf,100,stdin);
fputs(buf,fp);
fclose(fp);
exit(1);
}
else {
//parent progress
int status=0;
wait(&status);
if(WIFEXITED(status)){
printf("child progress return %d\n",WEXITSTATUS(status));
}
printf("I am parent progress,my pid is %d\n",getpid());
sleep(1);
printf("what you just typed was:\n");
FILE *fp;
if((fp=fopen("lab1.txt","a+"))==NULL){
fprintf(stdout,"Can't open \"lab1\" file.\n");
exit(EXIT_FAILURE);
}
char buff[100]={0};
fgets(buff,100,fp);
printf("%s\n",buff);
fclose(fp);
}
return 0;
}
四、执行结果
参考文献:
方敏.计算机操作系统[M].西安.西安电子科技大学出版社,2004.57~68.