一、创建子进程一,在子进程中递归打印/home目录中的内容(可以用exec系列函数调用第一次实验中的代码完成此功能);
子进程结束的时候完成以下功能:
1.打印字符串“Child process exited!”
2.打印子进程标识符,打印父进程标识符。
二、创建子进程二, 打印子进程运行环境中环境变量“USER”的值,通过exec系列中的某个函数设置子进程”USER”环境变量值为“zhangsan”,并且让该子进程同时完成以下命令:“ls –li /home”.
1.打印字符串“Child process exited!”
2.打印子进程标识符,打印父进程标识符。
二、创建子进程二, 打印子进程运行环境中环境变量“USER”的值,通过exec系列中的某个函数设置子进程”USER”环境变量值为“zhangsan”,并且让该子进程同时完成以下命令:“ls –li /home”.
5.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void cpexit()
{
printf("\n\n");
printf("Child process exited!\n");
printf("child:%d \tparent:%d\n",getpid(),getppid());
{
printf("\n\n");
printf("Child process exited!\n");
printf("child:%d \tparent:%d\n",getpid(),getppid());
}
int main()
{
int a=fork();
atexit(cpexit);
if(a<0)
{
printf("fork error");
}
else if(a==0)//child1
{
if(execlp("/home/jincheng/5/tt6","tt6",NULL)>=0)
{
printf("execlp succes!");//->atexit(cpexit)
}
else
{
printf("error");
exit(-1);//->atexit(cpexit)
}
}
else
{
wait();
int b=fork();
if(b<0)
{
printf("fork error");
}
else if(b==0)//child2
{
printf("USER=%s\n",getenv("USER"));
system("ls -li /home");
char *envp[]={"USER=zhangsan",NULL};
if(execle("/usr/bin/env","env",NULL,envp)>=0)
{
printf("execle succes!");
}
else
{
printf("error");
exit(-1);
}
}
}
{
int a=fork();
atexit(cpexit);
if(a<0)
{
printf("fork error");
}
else if(a==0)//child1
{
if(execlp("/home/jincheng/5/tt6","tt6",NULL)>=0)
{
printf("execlp succes!");//->atexit(cpexit)
}
else
{
printf("error");
exit(-1);//->atexit(cpexit)
}
}
else
{
wait();
int b=fork();
if(b<0)
{
printf("fork error");
}
else if(b==0)//child2
{
printf("USER=%s\n",getenv("USER"));
system("ls -li /home");
char *envp[]={"USER=zhangsan",NULL};
if(execle("/usr/bin/env","env",NULL,envp)>=0)
{
printf("execle succes!");
}
else
{
printf("error");
exit(-1);
}
}
}
return 0;
}
}
需要调用到的遍历目录的功能文件为tt6.c,在执行5.c之前需要先编译tt6.c生成可执行文件tt6
tt6的源代码在前几个博客里有!
还有tt6的详解
特别说明:
Exec系列函数
在下面这个博客里有详解!很重要!点击打开链接
https://mp.csdn.net/postedit/80402628
atexit函数(登记函数)
当进程终止时,程序可能需要进行一些自身的清理工作,如资源释放等等。
atexit函数提供了进行这样工作的机会。
它允许用户注册若干终止处理函数,当进程终止时,这些终止处理函数将会被自动调用。
函数原型:int atexit(void (*func)(void));
参数:func:函数指针,返回值为void,无参
返回值:成功返回0,出错返回非0值
注意:先注册的函数,后被运行。 exit调用这些注册函数的顺序与它们 登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。
调用_exit函数并不会触发终止处理函数。