linux进程--学习总结

学习文件之后,紧接着学习进程的相关知识,这一章主要也是一些API的操作学习。
首先进程是什么啊,应该是某一执行某一个程序吧,就先这样理解吧

1.获取进程描述符getpid()
man手册:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);

操作:
pid_t pid;//定义
pid = getpid();//获取
注:同文件描述符一样,进程的这个描述符也是贯穿进程,走哪都有,它是进程的ID一样。

2.创建子进程fork() 非常重要
#include <unistd.h>
pid_t fork(void);
操作:
pid = fork(); //fork返回两个参数,非负数(子进程的pid)代表父进程,0代表子进程;
当创建完子进程后,父进程和子进程会一起往下执行后面的命令,这是时而父先时而子先,二者交替,这是在争夺CPU资源。
vfork()
子进程先运行,不会复制父进程的内存空间,退出后父进程再继续运行;类似于写时拷贝,内存是共享的,只有修改时才时拷贝。

补充:linux内存状态图
在这里插入图片描述
主体代码都存放在正文中,初始化过的数据,未初始化的数据。堆里面存放的是malloc申请的内存空间,栈里是函数调用相关操作。

3.等待退出wait()和exit()
若要求父进程等待子进程先运行,之后其再运行,则用wait()API
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
在这里插入图片描述

4.exec族API
这个API可有点来头,可以通过它调用其他进程,你看厉害不
#include <unistd.h>
int execl(const char *path, const char arg, …/ (char *) NULL */);
int execlp(const char *file, const char arg, … / (char *) NULL */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
操作:
execl("/bin/date",“date”,NULL,NULL)这句指令可以调用linux里bin目录下的data程序看系统时间。
下面介绍一个fork和execl结合起来实现修改文件的例子:
在这里插入图片描述

./changedata为上一章文件中revise.c生成的可执行文件
execlp与execl的区别是,前者不许写具体路径,可以帮忙直接找到需要调用的程序:
execlp(“date”,“date”,NULL,NULL);

char *argv[] = {“ps”,NULL,NULL};
execvp(“ps”,argv);

5.system()
#include <stdlib.h>
int system(const char *command);
system函数是对execl的封装,简化了调用函数
操作:
system(“date”);

6.popen()
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
在这里插入图片描述

popen比system更高级一些,它可以读取打开文件的内容,返回值是一个流,因此需要用fread来读取它。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值