Linuxc高级编程之进程5

26 篇文章 0 订阅
24 篇文章 0 订阅
一、创建子进程一,在子进程中递归打印/home目录中的内容(可以用exec系列函数调用第一次实验中的代码完成此功能);
子进程结束的时候完成以下功能:
    1.打印字符串“Child process exited!”
    2.打印子进程标识符,打印父进程标识符。
二、创建子进程二, 打印子进程运行环境中环境变量“USER”的值,通过exec系列中的某个函数设置子进程”USER”环境变量值为“zhangsan”,并且让该子进程同时完成以下命令:“ls –li /home”.

源代码:

5.c
#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());
}
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);
  }
  
  }
 }
 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函数并不会触发终止处理函数。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊飞飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值