栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

 


2.添加系统命令

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


3.移除添加的系统命令

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


4.僵尸进程

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//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 :%dn",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 :%dn",getpid());
			sleep(1);
		}
		wait(NULL);
	}

    exit(0);


       return 0;

}


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

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//1.system 的使用方法
//system 会调用fork 执行字符串所代表的命令
//3.执行完毕回到本任务,不代替系统的程序下文,exec 会屏蔽下文下一个命令,

int main(int argc,char *argv[])
{
	 printf("this is system test startn");
	 system("ls -all");
	 printf("this is system text overn");


       return 0;

}


6.exec 函数族

函数: execl   execlp  execv 

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// 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)

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// atexit() 函数 与 exit() 一起使用 当exit函数退出程序时 运行 atexit()函数
//
//
//
int *p =NULL;
void exit_fun()
{
	printf("this is exit %s startn",__func__);
	free(p);
	printf("this is exit %s endn",__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("111111111111111111n");
		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.检验结果 

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include   //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,"%sn",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 =%dn",sid);

	//3.修改权限掩码 
	if(umask(0026)<0)
	{
		perror("umask errorn");
		return -1;
	}
	//4.修改工作目录
	if(chdir(".")<0)
	{
		perror(" chdir errorn");
		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 %dn",getpid());//输入日志 到日志文件中
		printf("this is deamon process :%dn ",getpid()); //写入信息到重定向的文件描述符号里面去。
		syslog(LOG_INFO,"MY_SERVER_END %dn",getpid());      
		sleep(1);
	}


       return 0;

}

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

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include   //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,"%sn",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 =%dn",sid);

	//3.修改权限掩码 
	if(umask(0026)<0)
	{
		perror("umask errorn");
		return -1;
	}
	//4.修改工作目录
	if(chdir(".")<0)
	{
		perror(" chdir errorn");
		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("%sn",s);
		sleep(1);
	}
	close(fd);

       return 0;

}

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039410.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号