1、实验目的
1.1了解Linux进程的概念
1.2 掌握Linux进程的创建和控制。
1.3 掌握Linux守护进程的创建方法。
2、实验内容
创建test用户,密码也是test。
用test登陆后,创建src目录,所有的源代码、中间代码和目标代码都放在/home/admin/src目录下。
(1) 编写一个程序创建一个子进程,父进程随后挂起,子进程循环打印自己的进程号和父进程号,并对比ps查询到的进程号。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
pid_t pid,wpid;
int status;
pid=fork();
if(pid==-1)
{
perror("creat fault\n");
exit(0);
}
if(pid==0)
{
while(1)
{
printf("pid is:%d\n",getpid());
printf("ppid is:%d\n",getppid());
}
sleep(5);
}
else
{
wpid=wait(&status);
}
return 0;
}
(2) 编写一个程序创建n个子进程p1, p2, p3 … pn,其中n由键盘输入,p(i)是p(i+1)的父进程,打印每个进程的进程号,父进程号和子进程号。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
pid_t result;
int n,i;
int status;
printf("input n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("PPID:%d\n",getppid());
printf("ID:%d\n",getpid());
result=fork();
wait(&status);
if(result==-1)
{
printf("create fault\n");
}
if(result>0)
{
break;
}
printf("PID:%d\n",getpid());
}
return 0;
}
(3)编写一个程序创建n个子进程p1, p2, p3 … pn,其中p1, p2, … pn互为兄弟进程,都是一个进程的子进程,n由键盘输入,要求打印每个进程的进程号,父进程号。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t result;
int n ,i;
printf("input n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
result=fork();
if(result==-1)
{
printf("create fault\n");
}
if(result==0)
{
printf("PPID:%d\n",getppid());
printf("PID:%d\n",getpid());
break;
}
}
return 0;
}
(4) 分别使用exec函数族中的六个函数执行命令“ps -ef”。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
char *arg[]={"ps","-ef",NULL};
if(execv("/bin/ps",arg)<0)
{
perror("execv error");
}
if(execve("/bin/ps",arg,NULL)<0)
{
perror("execv error");
}
if(execlp("ps","ps","-ef",NULL)<0)
{
perror("execv error");
}
if(execvp("ps",arg)<0)
{
perror("execv error");
}
if(execle("/bin/ps","ps","-ef",NULL,NULL)<0)
{
perror("execv error");
}
if(execl("/bin/ps","ps","-ef",NULL)<0)
{
perror("execv error");
}
return 0;
}
(5) 编写一个程序实现守护进程,每隔10秒钟去系统时间,并追加到当前目录的time.txt文件中。
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<sys/param.h>
#include<time.h>
#include<stdlib.h>
int main()
{
FILE *fp;
time_t t;
pid_t result;
int i;
result=fork();
if(result>0)
exit(0);
else if(result<0)
{
perror("create child fault");
exit(1);
}
setsid();
chdir("/src");
umask(0);
for(i=0;i<NOFILE;++i)
close(i);
while(1)
{
sleep(10);
if((fp=fopen("time.txt","a"))>0)
{
t=time(0);
fprintf(fp,"time is:%s",asctime(localtime(&t)));
fclose(fp);
}
}
return 0;
}
(6)一个程序连续调用了三次fork()函数,如下图: int main() { fork(); fork(); fork(); return 0; } 问题1:这个程序共生成了多少个子进程;问题2:改写该程序,打印出每一个子进程及它的父进程;问题3:增加一次fork函数的都用,继续打印每一个子进程和它的父进程。
(1)8个
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t result1,result2,result3;
result1=fork();
result2=fork();
result3=fork();
scanf("%d",1);
return 0;
}
(2)
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t result1,result2,result3;
result1=fork();
result2=fork();
result3=fork();
printf("PID:%d\n",getpid());
printf("PPID:%d\n",getppid());
return 0;
}
(3)
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t result1,result2,result3,result4;
int status;
result1=fork();
result2=fork();
result3=fork();
result4=fork();
wait(&status);
printf("PID:%d\n",getpid());
printf("PPID:%d\n",getppid());
return 0;
}