2023年8月2日发(作者:)
wait头⽂件_Linux中⼦进程回收函数:wait和waitpid图控⼤叔构图传递思想阅读从未如此简单01前⾔ 在进程的开发中,我们常常需要创建⼦进程来实现进程的“分⾝”,但是⼦进程执⾏完任务之后,需要⽗进程对其进⾏资源回收,否则该⼦进程将变成僵⼫进程。那么⽗进程对⼦进程的资源回收所⽤到的函数则有我们今天的主⾓:wait和waitpid。02函数讲解wait()函数说明wait函数需要包含头⽂件#include
#include
函数原型pid_t wait (int * status);参数说明:1、如果⽗进程需要知道⼦进程结束时候的状态值.则可以填充参数 如: int status; //创建⼦进程及相应判断 printf("wait(&status) is %dn",wait(&status));2、如果⽗进程不需要知道⼦进程结束时候的状态值.则可以填充NULL 如: int status; //创建⼦进程及相应判断 printf("wait(NULL) is %dn",wait(NULL));返回值 1、 -1 ---》该⼦进程不存在 2、 ⼦进程pid
其他说明1、wait函数的调⽤暂时停⽌⽬前进程的执⾏, 直到有信号来到或⼦进程结束2、如果同时创建了多个⼦进程,并且这些⼦进程都有调⽤退出函数,如:exit 哪个⼦进程先介绍,wait就先返回哪个⼦进程的pid值 (⼩编做了好多次测试,发现都是其他⼀样效果,后来在⽼师的指导下才纠正了这个思维定式的问题)waitpid()函数说明waitpid函数需包含头⽂件#include
#include
函数原型pid_t waitpid(pid_t pid, int * status, int options);参数说明:pid: pid<-1 等待进程组识别码为 pid 绝对值的任何⼦进程. pid=-1 等待任何⼦进程, 相当于 wait(). pid=0 等待进程组识别码与⽬前进程相同的任何⼦进程. (和wait()⼀样) pid>0 等待任何⼦进程识别码为 pid 的⼦进程. 说明:pid 乱填,该进程组内没有此pid的⼦进程,会返回-1
status: ⽤法和wait⼀样
options:⼀般填0,有以下其他种选择,⼩编还没有弄懂,以后弄懂了再补充其他选择为:WNOHANG 如果没有任何已经结束的⼦进程则马上返回, 不予以等待.WUNTRACED 如果⼦进程进⼊暂停执⾏情况则马上返回, 但结束状态不予以理会. ⼦进程的结束状态返回后存于 status, 底下有⼏个宏可判别结束情况WIFEXITED(status) 如果⼦进程正常结束则为⾮ 0 值.WEXITSTATUS(status) 取得⼦进程 exit()返回的结束代码, ⼀般会先⽤ WIFEXITED 来判断是否正常结束才能使⽤此宏.WIFSIGNALED(status) 如果⼦进程是因为信号⽽结束则此宏值为真WTERMSIG(status) 取得⼦进程因信号⽽中⽌的信号代码, ⼀般会先⽤ WIFSIGNALED 来判断后才使⽤此宏.WIFSTOPPED(status) 如果⼦进程处于暂停执⾏情况则此宏值为真. ⼀般只有使⽤ WUNTRACED 时才会有此情况.WSTOPSIG(status) 取得引发⼦进程暂停的信号代码, ⼀般会先⽤ WIFSTOPPED 来判断后才使⽤此宏.返回值: 和wait⼀样。
其他说明:waitpid 1、如果所填pid所对应⼦进程不存在,则⽴即返回-1 2、如果所填pid存在,但是⼀直不退出,则⼀直等待 该⼦进程不退出为可能 1、调⽤了pause() 2、vfork函数创建的⼦进程未调⽤exit 因为fork函数创建的⼦进程调⽤return或者exit都可以退出 3、⼀直处于while循环中 4、还有其他情况,⼩编可能不知道01图⽚补充03代码参考测试代码#include
#include
int main(int argc,const char **argv){ pid_t cpid[2]; int status;
cpid[0] = fork(); if(cpid[0] == -1) { perror("进程1创建失败n"); return -1; } else if(cpid[0]==0) { printf("client1 id %d father id %dn",getpid(),getppid()); //sleep(0); //pause(); exit(0); }
cpid[1] = fork(); //printf("开始 2n"); if(cpid[1] == -1) { perror("进程2创建失败n"); return -1; } if(cpid[1]==0) { printf("client2 id %d father id %dn",getpid(),getppid()); //sleep(2); //pause(); //return 0; exit(0); } else{ //wait(&status);
//printf("wait is %dn",wait(&status));//⾸先结束第⼀个创建的⼦程序 //printf("wait is %dn",wait(&status)); //printf("wait(&status) is %dn",wait(&status)); printf("wait is %dn",waitpid(cpid[1],&status,WIFEXITED(status))); //printf("wait cpid[1] %d is %dn",cpid[1],waitpid(cpid[1],&status,0));
printf("father id is %dn",getpid());
} return 0;}04留个问题 exit函数让调⽤者所对应进程结束,那么exit函数有负责进程资源的回收吗?答案是没有。exit和wait有什么不⼀样?当然有,⾃⼰总结!05结尾 本次关于Linux环境下⼦进程内存资源的回收所涉及的部分函数:wait和waitpid就分享到这⾥,如有纰漏,希望不吝赐教!谢谢阅读!
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690955314a472338.html
评论列表(0条)