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