linux进程、线程常用的几个基础知识点
来源:互联网 发布:苹果笔记本mac系统盘 编辑:程序博客网 时间:2024/04/28 13:14
1. Fork会复制父进程所有资源,父子进程完全独立。虽然一个进程可以包含多个线程,但是fork后的子进程是单线程的。
2. vfork不会复制所有的资源,父子进程共享地址空间,在子进程中队虚拟内存空间变量的修改其实也是对父进程中值的修改。同时子进程运行时会阻塞父进程。子进程调用结束时要调用_exit() 退出,不然子进程的输入输出缓存会影响到父进程,exit会刷新输入输出流,清空缓冲区,可能造成临时文件丢失,所以在子进程中一般不用exit。_exit不会进行刷新缓冲区等操作,所以fork,vfork创建的子进程一般都用_exit退出
3. fork后的父子进程代码段,数据段,堆栈段的内容都是相同的,只是用if-eles 判断fork的返回值来走不同的分支
4. exec() 把进程的代码段、数据段、堆栈段的内容都被替换掉。
所以一般 fork一个子进程,然后在子进程中调用exec,子进程就完全被替换掉了
父进程自己跑自己的
execl;ececlp;execle;execv;execve;execvp 出错返回-1,正确无返回值
P:path,第一个参数执行文件名可以不用带路径,函数自动搜索系统的path路径
l:list execl(“pw”,参数a,参数b,null);
v:vector execve(“pw”,argv,environ) char*argv[] 的最后一个指向null
e:environment ;extern char** environ 当前程序的全局环境
Fork.o
#include<stdio.h>
int main(int argc ,char* argv[])
{
printf("welecometo PW\n");
int i=0;
for(;i<argc;i++)
{
printf("argv[%d]:[%s]\n",i,argv[i]);
}
return 0;
}
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
void main(int argc,char* argv[])
{
pid_t pid;
int status;
extern char**environ;
int i=0;
for(;i<argc;i++)
{
printf("i=%d,argv=[%s]\n",i,argv[i]);
}
//execve("PW",argv,environ);
//printf("运行上一句execve ,这一句不会输出,后面的都不会执行n");
if((pid=vfork())<0)
{
printf("forkerr\n");
exit(1);
}
elseif(pid==0)
{
printf("line16:this child process %d,parent is %d\n",getpid(),getppid());
usleep(1000000);
execve("PW",argv,environ);
_exit(1);
}
else
{
printf("thisparent %d,child is %d\n",getpid(),pid);
printf("parent has waited child %d\n",wait(&status));
}
}
————————————————————————————————————
PW
#include<stdio.h>
int main(int argc ,char* argv[])
{
printf("welecometo PW\n");
int i=0;
for(;i<argc;i++)
{
printf("argv[%d]:[%s]\n",i,argv[i]);
}
return 0;
}
[root@localhost7-PcroceeControl]# ./fork.o PW
i=0,argv=[./fork.o]
i=1,argv=[PW]
line16:this child process 3507,parent is 3506
thisparent 3506,child is 3507
welecometo PW
argv[0]:[./fork.o]
argv[1]:[PW]
parenthas waited child 3507
5. 进程等待
Sys/types.h
Sys/wait.h
Pid_t wait(int *status);
Pid_t waitpid(pid_t pid,int *status,int options)
Int waited(idtype_t idtype,id_t id, siginfo_t *infop,intoptions);
Wait() = waitpid(-1, &status, 0);子进程不存在
Pid<-1 等待进程组id=pid的绝对值的任一子进程
pid=-1 等待任一子进程
pid=0 等待组id等于调用组id 的任一子进程
pid>0 等待进程id等于pid的子进程
6. 进程组
Sys/types.h
unistd.h
pid_t getpgrp(viod);
int setpgid(pid_t pid,pid_t pgid) 成功0,失败-1 :pid等于pgid时用于创建新的进程组,不等时则把pid加入pgid组
进程调度
Sched.h
Int sched_setscheduler(pid_t pid,int policy,const structsched_param *param);
Int sched_getscheduler(pid_t pid);
Setpriority() ;getpriority()
int phread_cancel(phread_t pt);取消一个线程
int phread_detach(pthread_t pt);分离一个线程
int phread_equal(pthread_t pt1,pthread_t pt2);是不是同一线程,pt1,pt2不是整数只能用这个函数判断
- linux进程、线程常用的几个基础知识点
- Linux操作系统几个常用知识点
- 进程的基础知识点
- JAVA基础中的几个常用知识点
- Android常用的几个知识点
- 几个常用线程的
- 【Linux基础】进程和线程的区别
- linux进程通讯和线程同步知识点
- java.关于线程同步的几个知识点
- websphere 下常用的几个知识点
- 有关UIView、subview的几个基础知识点
- windows程序设计的一些基础知识点—— 进程及其线程
- OS中关于进程线程的知识点
- 进程与线程的基本知识点
- .Net几个基础知识点
- PHP几个基础知识点
- 进程、线程 知识点整理
- 进程和线程知识点
- 设计模式 六大原则
- SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
- c++实现反射机制(两篇)
- 提高 分类器 准确率的几种方法总结
- 路由分类
- linux进程、线程常用的几个基础知识点
- 树莓派UDP通信及串口通信
- iOS开发笔记--解决UITableView中Cell重用机制导致内容出错的方法总结
- 使用 Java 实现 Comet 风格的 Web 应用
- MySQL之alter语句用法总结
- Scala 循环
- BspTree分区二叉树
- T-SQL查询高级—SQL Server索引中的碎片和填充因子
- TC_SRM_621_DIV2