高级编程之进程(三)

来源:互联网 发布:excel数据导入matlab 编辑:程序博客网 时间:2024/06/05 16:26

进 程 的 使 用

 

1、多进程逻辑处理
2、exec函数族启动其他进程
3、制作守护进程

 

exec函数族

1、  l  ==>列表   v ==》数组/容器  

原型:int execl(const char *path, const char *arg, ...);
功能:通过该函数可以将指定的path路径下程序名称为arg的
   程序启动起来。
参数: path 要启动的程序的路径+文件名称
   arg  要启动的程序名称
   ...  可变长参数  ===》l 生效的地方,当前启动程序的参数
        都是以列表传参数的形式调用函数,参数最后
      以NULL结尾。
返回值:
  成功   0
  失败  -1

原型:int execv(const char *path, char *const argv[]);
功能:同execl类似都是启动程序用。
参数: path 要启动的程序路径+文件名称
    argv 要启动的程序的参数对应的字符数组。
    该数组是启动程序的参数列表。
返回值:成功 0
  失败   -1;


原型:int execlp(const char *file, const char *arg, ...);
功能:该函数可以在PATH环境变量指定的范围内查找程序名称为
   file 的程序并启动执行。
参数:file 要启动的程序的名称
   arg 要启动的程序的第0个参数,一般是程序名称。
   ...可变长参数,表示程序启动的其他参数。
返回值:成功 0
  失败  -1;

 

原型:int execvp(const char *file, char *const argv[]);

原型:int system(char *cmd)
功能:在当前进程中自动fork一个子进程并执行cmd命令。
参数:cmd 要执行的shell命令
返回值:成功 0
  失败 -1;


练习:
 尝试用以上几种不同的启动程序方式,实现KILL命令的效果。

 扩展:如何能在一个进程中杀死多个指定的进程。
 再扩展: 如何实现一个自己的命令行终端。


守护进程的制作:

1、孤儿进程

2、会话组长
  pid_t setsid(void);
  功能:将该代码执行的进程修改为会话组长。

3、工作目录
  chdir(char * path);
  功能:将当前进程的工作目录修改为指定的path路径。
       以避免守护进程所在工作目录被卸载。

4、权限掩码
  mode_t umask(mode_t mask);
  功能:修改当前程序的权限掩码,方式守护进程由于
    权限不够导致异常。

5、文件描述符
   close()  ===> getdtablesize()
   int getdtablesize(void);
   功能:获取当前进程中已经打开的最大文件描述符。

守护进程的验证:
1、ps -ef  ===>父进程pid  =1
2、ps -ef tty列 应该是?
3、ps aux stat列 应该有s,表示会话组长。

一般会把守护进程的创建写一个独立的函数:


练习:
 设计一个守护进程,每隔一秒向同名日志文件中
 写入一行不重复的语句。


 设计一个守护进程,每隔10分钟判断 xxx.db 的是否
 有变化,有变化则备份到其他路径。

 

 

 

0 0
原创粉丝点击