Linux多进程编程

进程的状态linux进程有7种基础状态(两种running算一种),除了traced都可以用$ps命令查看,$ps可以查看的进程状态如下,更多进程状态信息参见linux process vs thread vs lwp
r running or runnable (on run queue)
d uninterruptible sleep (usually io)
s interruptible sleep (waiting for an event to complete)
t stopped, either by a job control signal or because it is being traced.
w paging (not valid since the 2.6.xx kernel)
x dead (should never be seen)
z defunct (zombie) process, terminated but not reaped by its parent.
模型多进程代码区模型(其他区参见copy-on-write):
#include #include #include #include getpid()/getuid()/getgid() //获得pid/uid/gidfork()/vfork() //创建子进程exec() family //替代子进程atexit()/on_exit()/exit()/_exit()/_exit() //退出子进程wait()/waitpid() //获得子进程退出状态getpid()、getppid()//getpid() 返回调用进程的pid//getppid() 返回调用进程的父进程的pidpid_t getpid(void); //pid_t是intpid_t getppid(void); getuid()、geteuid()getuid()返回调用进程的uidgeteuid()返回调用进程的effective uiduid_t getuid(void); //uid_t是unsigned intuid_t geteuid(void); getgid(),getegid()//getgid()返回调用进程的real gid//getegid()返回调用进程的effective gidid_t getgid(void); //gid_t是unsigned intgid_t getegid(void); printf(pid=%d\n,getpid()); printf(ppid=%d\n,getppid()); printf(uid=%d\n,getuid()); printf(gid=%d\n,getgid()); }fork()//创建子进程,在父进程中返回子进程的pid,在子进程中返回0,失败在父进程中返回-1pid_t fork(void); fork()创建的子进程继承父进程的有:
实际用户id,实际组id,有效用户id,有效组id附属组id进程组id会话id控制终端设置用户id标志和设置组id标志当前工作目录根目录文件模式和安排信号屏蔽和安排对任一打开fd的close-on-exec环境连接的共享存储段存储映像资源限制与父进程有区别的有
fork的返回值pidppid子进程的tms_utime,tms_stime,tms_cutime,tms_ustime被设置为0不继承文件锁子进程未处理闹钟被清除子进程未处理信号集设置为空集父子进程代码区执行次序fork()产生的所有进程共享代码区,copy-on-write其他区)
fork()之前的代码, 由parent执行一次fork()之后的代码, 由父子进程各执行一次fork()的返回值由父子进程各自返回一次copy-on-write:fork()一下干的几件事:
给p2分配text段, data段, heap段, stack段的虚拟地址,都指向p1中相应的物理地址p2的text段是铁定和p1共享同一个物理地址了, 剩下的data,heap,stack待定如果one of them 改变了这三个段的内容, 就把原来的数据复制一份给p2, 这样p2就有了相应的新的物理地址//创建任意多个进程:子进程干活,父进程创建一个爹一堆儿子int i=0;for(i=0;i0 //指定pidpid=0 //gid是调用进程pid的子进程pid=-1 //任何子进程pid父子进程使用的读写位置信息是同一份=>文件表是同一份=>但是两个是不同的fd, 所以fork()创建子进程也会复制一个文件描述符总表正是因为使用读写一次 offset会向后移, 所以没有覆盖, 因为后来的是使用前面留下的offset的位置, 所以使用的读写信息是一样的/*--------------------------------------------child终止时自动释放malloc()----------------------------------------------*/#include#include#include#include#define pi 3.141592657int *ipdata=null;///*void fa(){ free(ipdata); ipdata=null;}//*/int main(){ pid_t pid=fork(); if(-1==pid) perror(fork),exit(-1); if(0==pid){ printf(1); printf(child starts\n); ipdata=(int*)malloc(sizeof(int)); if(null==ipdata) printf(malloc fails\n);// perror(malloc),exit(-1); //?// *ipdata=data; int res=atexit(fa); if(0!=res){ printf(atexit fails\n); exit(exit_failure); } printf(please input a radius:); scanf(%d,ipdata); printf(primeter is:%lf\n,2*pi*(*ipdata)); exit(exit_success); } printf(parent starts\n); int stat=0; pid=wait(&stat); if(wifexited(stat)) printf(child has terminated,its status:%d\n,wexitstatus(stat)); return 0;}note:
用全局变量做桥梁atexit()里面的函数一定是int *(void)函数的形参列表变了也不行attention: vfork()的child虽然整个内存区都是和parent共享的, 但是变量的作用域还是在啊, 所以你跨函数使用变量肯定要传参的啊/*--------------------------------------------on_exit.c, child终止时自动释放malloc()----------------------------------------------*/#include#include#include#include#include#include#includevoid fa(int status,void* pv){ printf(obtained status=%d\n,status); free(pv); pv=null;}int main(){ //创建子进程,使用fork() pid_t pid=fork(); if(-1==pid){ printf(parent starts%d\n,pid); } if(0==pid){ printf(child starts%d\n,getpid()); int *pi=(int*)malloc(sizeof(int)); if(null==pi) printf(malloc error),exit(-1); //use on_exit()register function if(0!=on_exit(fa,pi)) perror(on_exit),exit(-1); printf(please input a radius(int)\n); scanf(%d,pi); printf(the primeter is:%lf\n,2*3.14*(*pi)); //terminate child and free dynamic memory automatically exit(100); } //父进程等待子进程终止, 获取退出状态 int status=0; int res=waitpid(pid,&status,0); if(-1==res) perror(waitpid),exit(-1); if(wifexited(status)) printf(status of child:%d\n,wexitstatus(status)); return 0;}

木质扬声器diy教程
STM32单片机的重映射与地址映射的使用方法及步骤
台积电、世界先进不太可能下调8英寸代工报价
芯片制造全过程是怎样的
WBRU模组的特性及应用领域
Linux多进程编程
C语言中指针变量的使用
中国电信在5G+工业互联网领域继续深入合作
拉姆达夜视红外热成像汽车夜视系统应用
VR/AR技术在不同行业领域都有哪些应用呢?
世强电讯授权代理Agilent新型2000X 和3000X系列示波器
NEC:通信标准仍是抄表行业一大挑战
危化品气瓶如何用RFID加强安全性
如何在单片机上实现开根号
基片集成波导转换器的设计与仿真
随着互联网的发展,将开启服装智慧新零售
怎样实现大面积单结集成型a-Si:H太阳电池的结构与制备?
电梯IP五方对讲机功能介绍及常见问题解决方法
工业以太网相比于现场总线技术具有以下几个特点
电容的尺寸、耐压值、方向讲解