Linux进程与守护进程的编写

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;
 
}
发布了20 篇原创文章 · 获赞 2 · 访问量 335

猜你喜欢

转载自blog.csdn.net/weixin_44931542/article/details/105637023