根据上文完成如下例程设计:
1.创建fork进程,打印进程PID
2.创建vfork进程,打印进程PID
3.创建vfork进程,然后对文件进行不同操作
4.execl,execv函数使用
5.execlp,execvp函数使用
6.execle,execve函数使用
7.wait,waitpid函数使用
8.创建守护进程,为一个文件写数据1s写一行数据(在更换目录时,如果目录不存在,创建工作目录)。
代码如下::
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
int process_exp1();
int process_exp2();
int process_exp3();
int process_exp4();
int process_exp5();
int process_exp6();
int process_exp7();
int process_exp8();
int exp8_fun();
//*************************************************************************
//******************************exp8*************************************
int exp8_fun()
{
int i=0,j=0;
FILE *fp;
setsid();
if(access("/home/xy/tmp",0)==-1)
{
mkdir("/home/xy/tmp",0777);
}
chdir("/home/xy/tmp");
umask(0);
for(i=0;i<getdtablesize();i++)
{
close(i);
}
fp=fopen("test.txt","w");
while(j<999)
{
fprintf(fp,"%4d: ",j);
for(i=0;i<10;i++)
{
fprintf(fp,"%d ",i);
}
fprintf(fp,"\n");
j++;
sleep(1);
}
fclose(fp);
return 0;
}
int process_exp8()
{
pid_t fork_pid;
fork_pid=fork();
if(fork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(fork_pid>0)
{
exit(0);
}
else
{
exp8_fun();
}
return 0;
}
//-----------------------------------------------------------------------
//******************************exp7*************************************
int process_exp7()
{
pid_t fork_pid;
fork_pid=fork();
if(fork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(fork_pid==0)
{
printf("new:fork_pid: %d\n",fork_pid);
printf("new:procesee id: %d\n",getpid());
printf("new:ppid=%d\n",getppid());
exit(0);
}
else
{
//wait(NULL);
waitpid(fork_pid,NULL,0);
printf("old:fork_pid: %d\n",fork_pid);
printf("old:procesee id: %d\n",getpid());
printf("old:ppid=%d\n",getppid());
}
return 0;
}
//-----------------------------------------------------------------------
//******************************exp6*************************************
int process_exp6()
{
//execle,execve需要完整路径信息,配置新的环境变量
//execle传参数列表,execve传参数向量表
pid_t fork_pid;
fork_pid=fork();
if(fork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(fork_pid==0)
{
char *envp[]={"PATH=/tmp","USER=xy","a=b;",NULL};
char *arg_cmd[]={"env",NULL};
int exec_status;
printf("use exec:(env)\n");
//exec_status=execle("/bin/env","env",NULL,envp);
exec_status=execve("/bin/env",arg_cmd,envp);
if(exec_status==-1)
{
perror("execlp error !!!\n");
}
exit(1);
}
else
{
printf("ok");
}
return 0;
}
//------------------------------------------------------------------------
//*******************************exp5*************************************
int process_exp5()
{
//execlp,exexvp不用加路径,系统会通过文件名在环境变量中查找
//execlp参数列表,execvp传参数向量表
pid_t fork_pid;
fork_pid=fork();
if(fork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(fork_pid==0)
{
char *arg_cmd[]={"lspci",NULL};
int exec_status;
printf("use exec:(lspci)\n");
//exec_status=execlp("lspci","lspci",NULL);
exec_status=execvp("lspci",arg_cmd);
if(exec_status==-1)
{
perror("execlp error !!!\n");
}
exit(1);
}
else
{
printf("ok");
}
return 0;
}
//-----------------------------------------------------------------------
//*******************************exp4*************************************
int process_exp4()
{
//execl,execv需要完整的路径信息
//execl传参数列表,execv传参数向量表
pid_t fork_pid;
fork_pid=fork();
if(fork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(fork_pid==0)
{
char *arg_cmd[]={"ls",NULL};
int exec_status;
printf("use exec:(ls)\n");
//exec_status=execl("/bin/ls","ls",NULL);
exec_status=execv("/bin/ls",arg_cmd);
if(exec_status==-1)
{
perror("exec error!!!\n");
}
exit(1);
}
else
{
printf("ok");
}
return 0;
}
//-----------------------------------------------------------------------
//*******************************exp3*************************************
int process_exp3()
{
FILE *fp=NULL;
char str[99];
int str_len=0;
pid_t vfork_pid;
vfork_pid=vfork();
if(vfork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(vfork_pid==0)
{
fp=fopen("exp3.txt","w");
printf("input char:");
fgets(str,99,stdin);
fputs(str,fp);
fclose(fp);
exit(0);
}
else
{
fp=fopen("exp3.txt","r");
fgets(str,99,fp);
str_len=strlen(str);
printf("str_len=%d,str: %s",str_len,str);
fclose(fp);
remove("exp3.txt");
}
return 0;
}
//------------------------------------------------------------------------
//*******************************exp2*************************************
int process_exp2()
{
pid_t vfork_pid;
vfork_pid=vfork();
if(vfork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(vfork_pid==0)
{
printf("new:vfork_pid: %d\n",vfork_pid);
printf("new:procesee id: %d\n",getpid());
printf("new:ppid=%d\n",getppid());
exit(0);
}
else
{
printf("old:vfork_pid: %d\n",vfork_pid);
printf("old:procesee id: %d\n",getpid());
printf("old:ppid=%d\n",getppid());
}
return 0;
}
//*******************************exp1*************************************
int process_exp1()
{
pid_t fork_pid;
fork_pid=fork();
if(fork_pid==-1)
{
printf("create process failed !!!\n");
}
else if(fork_pid==0)
{
printf("new:fork_pid: %d\n",fork_pid);
printf("new:procesee id: %d\n",getpid());
printf("new:ppid=%d\n",getppid());
exit(0);
}
else
{
printf("old:fork_pid: %d\n",fork_pid);
printf("old:procesee id: %d\n",getpid());
printf("old:ppid=%d\n",getppid());
}
return 0;
}
//----------------------------------------------------------------------
//*******************************main************************************
int main()
{
int n=0;
printf("<_>*******************exp process***********************<_>\n");
printf("1.创建fork进程,打印进程PID *\n");
printf("2.创建vfork进程,打印进程PID *\n");
printf("3.创建vfork进程,然后对文件进行不同操作 *\n");
printf("4.execl,execv函数使用 *\n");
printf("5.execlp,execvp函数使用 *\n");
printf("6.execle,execve函数使用 *\n");
printf("7.wait,waitpid函数使用 *\n");
printf("8.创建守护进程,为一个文件写数据1s写一个 *\n");
printf("<_>-----------------------------------------------------<_>\n");
printf("please select exp number: \n");
scanf("%d",&n);
do
{
}while(getchar()!='\n');
switch(n)
{
case 0 : break;
case 1 : process_exp1(); break;
case 2 : process_exp2(); break;
case 3 : process_exp3(); break;
case 4 : process_exp4(); break;
case 5 : process_exp5(); break;
case 6 : process_exp6(); break;
case 7 : process_exp7(); break;
case 8 : process_exp8(); break;
default :
printf("input error!!! restart!\n");
break;
}
printf("run finish !!!! *bye bye!!!\n");
exit(0);
return 0;
}
//---------------------------------------------------------------------