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