等待进程结束函数中的BUG】的更多相关文章

偶然发现一个BUG,有一个函数是这样写的: void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, , dwPid); if ( NULL == hProcess ) { DWORD dwErr = GetLastError(); Printf("GetLastError=%d.\n", dwErr); } WaitForSingleObject(hProcess,INFINI…
若子进程先于父进程结束时,父进程调用wait()函数和不调用wait()函数会产生两种不同的结果: --> 如果父进程没有调用wait()和waitpid()函数,子进程就会进入僵死状态. --> 如果父进程调用了wait()和waitpid()函数,就不会使子进程变为僵尸进程. 这是为什么呢?现在我们来深入学习wait()函数和waitpid()函数. wait() 和 waitpid() 学习 1.首先我们先看一下它们的函数原型: 在终端输入命令:man 2 wait 就会看到它的函数原型…
当子进程先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵死状态. pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); ---------------------------------------------------------------------------------------------------------- The wait() syste…
这篇博客的形式我想以分析代码不同情况为主: 点击(此处)折叠或打开 #include<stdio.h> #include<pthread.h> #include<time.h> #include<unistd.h> #include<errno.h> #include<stdlib.h> void *child(void *argv) { int pid; printf("这是线程在运行\n");        …
我们一直在强调一个概念就是进程是一个程序执行的实例,是内核在虚拟概念下创建的实体,它实例化的体现在用户态就是程序代码和代码使用的变量(存储空间),在内核态就是内核为我们每个进程所保存的数据结构(状态信息)等. 当一个进程由于某种原因停止时,内核并不是直接将为它保存的状态信息从内核移除,相反,进程会一直被保持在一种已经终止的状态,直到被它的父进程回收,当父进程回收已经终止的子进程时,内核会将子进程的退出状态传递给父进程,然后抛弃已经终止的进程,从此刻开始,这个进程才会消失,一个子进程结束但是还没有…
<!--[if !supportLists]-->Ÿ <!--[endif]-->等待子进程结束 pid_t waitpid(pid_t pid, int *stat_loc, int options) 另外有一个函数叫wait,其相当于 waitpid(-, &status, ) 大家经常看到的关于waitpid的经典例子是:你下载了某个软件的安装程序A,其在安装即将结束时启动了另外一个流氓软件的安装程序B,当B也安装结束后,其告诉你所有安装成功了.A和B分别在不同的进程…
在exec执行一个子进程,我们希望使用管道取得子进程在重定向后的标准输出上的结果,同时等待子进程的结束.那么是等待子进程结束后才取管道数据,还是边取数据边等待子进程结束呢? 这里有一个调试的例子.u0_a89是例子中app的用户id. android app 进程 5990,exec了一个sh子进程 6251,去执行命令子进程.     可以查看到app进程由zygote创建,app进程创建了6251,6251创建了6252,并且app进程及其子进程都阻塞去睡眠了.原本6252子进程执行着一个不…
1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的.但是它执行的时候对外来说就是一个独立的进程. 这个进程中,可以包含多个线程,也可以只包含一个线程. 当用c写一段程序的话,就是在操作系统中起一个进程它包含一个线程. 而当用java等开发一个多线程的程序的话,它在操作系统中起了一个进程,但它可以包含多个同时运行的线程. 你起一个CS游戏,这上CS游…
int status; pid_t t = fork(); if(t){     waitpid(t, &status, 0); }else{     system("vi temp.txt");     exit(0); } //父进程和子进程均执行完毕后继续执行下去   分析过程: if 和 else 还是选择分支. 主要的原因是,fork() 函数调用一次,返回两次.两次返回的区别是:子进程的返回值是0,父进程返回值为新子进程的进程ID.返回后,父进程执行waitpid(…
0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如:#define memcpy(dst,src,n) \    __asm__("cld;rep;movsl"::"D"((long)(dst)),"S"((long)(src)), "c"((long)(n)/4)) //memcpy(cp, bh->b_data, BLOCK_SIZE);    for (j=0; j<BLOCK_…