系统编程 day05 (Linux )(进程知识,exec,system,exit ,守护进程,)(僵尸进程)

本文探讨了进程状态、守护进程的创建方法、僵尸进程的模拟与避免,以及系统命令和exec函数族的使用,包括`sudomv`、`system`、`execl`等。还介绍了exit和atexit函数在结束进程时资源清理的重要性。
摘要由CSDN通过智能技术生成

1.进程状态的缩写  (后面有 + 号  代表是在前台运行)

 


2.添加系统命令

#  sudo mv  a.out /bin                  (a.out  是可执行的文本命令程序)


3.移除添加的系统命令

# sudo mv /bin/a.out  /dev/null           (dev/null 是系统的垃圾桶)


4.僵尸进程

代码:

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用:僵尸进程        要求(会编写文本应用文件)  
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
//1.目标:模拟僵尸进程 -避免僵尸进程
//2.产生:父进程分配子进程空间和回收子进程  当子进程结束,父进程太忙,不能即使回收 
//3.危害: 占用内存,使得进程空间减少!
//4.解决方案 : 等子进程结束以后,父进程再忙
int main(int argc,char *argv[])
{

	pid_t pid =fork();
	if(pid <0)
	{
		exit(0);
	}
	else if(pid ==0)
	{
		printf("this is child :%d\n",getpid());
	}
	else if(pid >0)
	{
		printf("this is parent  procee: %d \n",getpid());
		for(int i=0;i<10;i++)
		{
			printf(" this is the tezt :%d\n",getpid());
			sleep(1);
		}
		wait(NULL);
	}

    exit(0);


       return 0;

}


5.system(const char * str)  函数  :系统命令函数 

代码:

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用:system 函数的使用 
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
//1.system 的使用方法
//system 会调用fork 执行字符串所代表的命令
//3.执行完毕回到本任务,不代替系统的程序下文,exec 会屏蔽下文下一个命令,

int main(int argc,char *argv[])
{
	 printf("this is system test start\n");
	 system("ls -all");
	 printf("this is system text over\n");


       return 0;

}


6.exec 函数族

函数: execl   execlp  execv 

代码:

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用:exec 函数族  的使用(六个函数) 
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
// 1.exec 函数族 : 不创建新的进程 ,替换程序下文
//2. execl execv execlp 
int main(int argc,char *argv[])
{
	printf("this is exec is test begin \n");
	//参数 :路径 命令 参数 操作对象 NULL 
	//execl("/bin/ls","ls","-l",NULL);  //四个参数 
	//execlp("/bin/ls","ls","-l","./",NULL);//五个参数 
	

	char *command[] ={"ls","-l","./",NULL};
	execv("/bin/ls",command);  //函数的格式 execv("绝对路径" ,指针数组)
	printf("this is exec test test end \n");
	printf("11111111  this is exec test test end \n");
    return 0;

}


7.exit (int a)  函数  重点  : atexec 的使用方法  在exit 函数结束时 调用函数释放空间。(比如说

close free,fclose)

代码:

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用:exit() _exit() atexit() 函数的使用
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
// atexit() 函数 与 exit() 一起使用 当exit函数退出程序时 运行 atexit()函数
//
//
//
int *p =NULL;
void exit_fun()
{
	printf("this is exit %s start\n",__func__);
	free(p);
	printf("this is exit %s end\n",__func__);
}
int main(int argc,char *argv[])
{
	pid_t pid =fork();
	if(pid<0)
	{
		exit(-1);
	}	
	else if(pid ==0)
	{
		atexit(exit_fun);
		p=(int*)malloc(sizeof(int));
		printf("111111111111111111\n");
		printf("this is child :%d \n",getpid());
		exit(0);
	}
	else if(pid>0)
	{
		//wait(NULL);
		printf("this is parent :%d \n",getpid());
		wait(NULL);
	}



       return 0;

}


8.守护进程

//函数思维
//1.创建子进程  fork
//2.子进程创建新的会话  setsid 
//3.修改权限掩码    0077 只能自己用        600 可读可写  umask
//4.修改工作目录    chdir
//5.文件重定向 dup2 

//6.关闭父进程打开的三个文件描述符号 输入 输出  错误报错  close
//7.记录 写到日志文件中
//8.检验结果 

代码:

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用: 守护进程  daemon 
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<syslog.h>   //syslog 函数  向系统日志文件输入信息

//函数思维
//1.创建子进程  fork
//2.子进程创建新的会话  setsid 
//3.修改权限掩码    0077 只能自己用        600 可读可写  umask
//4.修改工作目录    chdir
//5.关闭父进程打开的三个文件描述符号 输入 输出  错误报错  close
//6.文件重定向 dup2 
//7.记录 写到日志文件中
//8.检验结果 

void time1()
{
	FILE* fp =fopen("1.txt","a+");
	time_t tm1 =time(NULL); //输出函
	char *s = ctime(&tm1);
	fprintf(fp,"%s\n",s);
	fclose(fp);
	
}

int main(int argc,char *argv[])
{
	pid_t pid= fork();
	if(pid <0)
	{
		exit(-1);
	}
	else if(pid>0) //1. 父进程退出
	{
		exit(0);
	}
	//2.创建新的进程会话
	pid_t sid =setsid();
	printf("sid =%d\n",sid);

	//3.修改权限掩码 
	if(umask(0026)<0)
	{
		perror("umask error\n");
		return -1;
	}
	//4.修改工作目录
	if(chdir(".")<0)
	{
		perror(" chdir error\n");
		return -2;
	}
	//5. 文件重定向
	int fd= open("/dev/null",O_WRONLY);	
	printf("fd =%d \n",fd);
	
	dup2(fd,STDIN_FILENO);
	dup2(fd,STDOUT_FILENO);
	dup2(fd,STDERR_FILENO);

	//6.关闭文件描述符号(上面)
	

	//7.记录到日志文件
	//8.日志记录函数 syslog()
	
	while(1)
	{
		syslog(LOG_INFO,"MY_SERVER_START %d\n",getpid());//输入日志 到日志文件中
		printf("this is deamon process :%d\n ",getpid()); //写入信息到重定向的文件描述符号里面去。
		syslog(LOG_INFO,"MY_SERVER_END %d\n",getpid());      
		sleep(1);
	}


       return 0;

}

9.练习 程序的功能: 写一个守护进程 把时间输入到文件里面去。

代码:

/************************************************************************************************************************************************************************************************************************
 *文件名:
 *作  者:She001
 *时  间:
 *版  本:
 *作  用: 练习  守护进程  向一个文件中输入时间(每一秒) 
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<sys/wait.h>
#include<a.out.h>
#include<signal.h>
#include<stdarg.h>
#include<sys/socket.h>
#include<utime.h>
#include<sys/utsname.h>
#include<sys/times.h>
#include<sys/un.h>
#include<ctype.h>
#include<dirent.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<syslog.h>   //syslog 函数  向系统日志文件输入信息

//函数思维
//1.创建子进程  fork
//2.子进程创建新的会话  setsid 
//3.修改权限掩码    0077 只能自己用        600 可读可写  umask
//4.修改工作目录    chdir
//5.关闭父进程打开的三个文件描述符号 输入 输出  错误报错  close
//6.文件重定向 dup2 
//7.记录 写到日志文件中
//8.检验结果 

void time1()
{
	FILE* fp =fopen("1.txt","a+");
	time_t tm1 =time(NULL); //输出函
	char *s = ctime(&tm1);
	fprintf(fp,"%s\n",s);
	fclose(fp);
	
}

int main(int argc,char *argv[])
{
	pid_t pid= fork();
	if(pid <0)
	{
		exit(-1);
	}
	else if(pid>0) //1. 父进程退出
	{
		exit(0);
	}
	//2.创建新的进程会话
	pid_t sid =setsid();
	printf("sid =%d\n",sid);

	//3.修改权限掩码 
	if(umask(0026)<0)
	{
		perror("umask error\n");
		return -1;
	}
	//4.修改工作目录
	if(chdir(".")<0)
	{
		perror(" chdir error\n");
		return -2;
	}
	//5. 文件重定向
	int fd= open("time.dat",O_RDWR|O_CREAT,0666);	
	printf("fd =%d \n",fd);
	
	dup2(fd,STDIN_FILENO);
	dup2(fd,STDOUT_FILENO);
	dup2(fd,STDERR_FILENO);

	//6.关闭文件描述符号(上面)
	

	//7.记录到日志文件
	//8.日志记录函数 syslog()
	time_t tm1 =time(NULL); //输出函
	while(1)
	{
		
		char *s = ctime(&tm1);
		printf("%s\n",s);
		sleep(1);
	}
	close(fd);

       return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值