4.2 进程的秘密(几个简单的例程)

根据上文完成如下例程设计:

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;
}
//---------------------------------------------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值