请问CreateProcessAsUser 为什么 产生的子进程可能会导致父进程崩溃? [问题点数:200分]

Bbs1
本版专家分:0
结帖率 88.24%
Bbs10
本版专家分:127589
Blank
进士 2018年总版新获得的技术专家分排名前十
Blank
红花 2019年1月 VC/MFC大版内专家分月排行榜第一
2018年12月 VC/MFC大版内专家分月排行榜第一
2018年11月 VC/MFC大版内专家分月排行榜第一
2018年10月 VC/MFC大版内专家分月排行榜第一
2018年9月 VC/MFC大版内专家分月排行榜第一
2018年8月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第一
2018年4月 VC/MFC大版内专家分月排行榜第一
2018年3月 VC/MFC大版内专家分月排行榜第一
2018年2月 VC/MFC大版内专家分月排行榜第一
2018年1月 VC/MFC大版内专家分月排行榜第一
2017年12月 VC/MFC大版内专家分月排行榜第一
2017年11月 VC/MFC大版内专家分月排行榜第一
2017年7月 VC/MFC大版内专家分月排行榜第一
2012年7月 VC/MFC大版内专家分月排行榜第一
Blank
黄花 2018年7月 VC/MFC大版内专家分月排行榜第二
2018年6月 VC/MFC大版内专家分月排行榜第二
2017年9月 VC/MFC大版内专家分月排行榜第二
2017年8月 VC/MFC大版内专家分月排行榜第二
2017年4月 VC/MFC大版内专家分月排行榜第二
2017年3月 VC/MFC大版内专家分月排行榜第二
2017年2月 VC/MFC大版内专家分月排行榜第二
2016年8月 VC/MFC大版内专家分月排行榜第二
2016年7月 VC/MFC大版内专家分月排行榜第二
2016年6月 VC/MFC大版内专家分月排行榜第二
2015年6月 VC/MFC大版内专家分月排行榜第二
Blank
蓝花 2017年10月 VC/MFC大版内专家分月排行榜第三
2017年6月 VC/MFC大版内专家分月排行榜第三
2017年5月 VC/MFC大版内专家分月排行榜第三
2016年9月 VC/MFC大版内专家分月排行榜第三
2016年4月 VC/MFC大版内专家分月排行榜第三
2015年4月 VC/MFC大版内专家分月排行榜第三
2012年8月 VC/MFC大版内专家分月排行榜第三
Bbs1
本版专家分:0
Bbs8
本版专家分:37481
Blank
蓝花 2016年1月 VC/MFC大版内专家分月排行榜第三
Bbs10
本版专家分:127589
Blank
进士 2018年总版新获得的技术专家分排名前十
Blank
红花 2019年1月 VC/MFC大版内专家分月排行榜第一
2018年12月 VC/MFC大版内专家分月排行榜第一
2018年11月 VC/MFC大版内专家分月排行榜第一
2018年10月 VC/MFC大版内专家分月排行榜第一
2018年9月 VC/MFC大版内专家分月排行榜第一
2018年8月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第一
2018年4月 VC/MFC大版内专家分月排行榜第一
2018年3月 VC/MFC大版内专家分月排行榜第一
2018年2月 VC/MFC大版内专家分月排行榜第一
2018年1月 VC/MFC大版内专家分月排行榜第一
2017年12月 VC/MFC大版内专家分月排行榜第一
2017年11月 VC/MFC大版内专家分月排行榜第一
2017年7月 VC/MFC大版内专家分月排行榜第一
2012年7月 VC/MFC大版内专家分月排行榜第一
Blank
黄花 2018年7月 VC/MFC大版内专家分月排行榜第二
2018年6月 VC/MFC大版内专家分月排行榜第二
2017年9月 VC/MFC大版内专家分月排行榜第二
2017年8月 VC/MFC大版内专家分月排行榜第二
2017年4月 VC/MFC大版内专家分月排行榜第二
2017年3月 VC/MFC大版内专家分月排行榜第二
2017年2月 VC/MFC大版内专家分月排行榜第二
2016年8月 VC/MFC大版内专家分月排行榜第二
2016年7月 VC/MFC大版内专家分月排行榜第二
2016年6月 VC/MFC大版内专家分月排行榜第二
2015年6月 VC/MFC大版内专家分月排行榜第二
Blank
蓝花 2017年10月 VC/MFC大版内专家分月排行榜第三
2017年6月 VC/MFC大版内专家分月排行榜第三
2017年5月 VC/MFC大版内专家分月排行榜第三
2016年9月 VC/MFC大版内专家分月排行榜第三
2016年4月 VC/MFC大版内专家分月排行榜第三
2015年4月 VC/MFC大版内专家分月排行榜第三
2012年8月 VC/MFC大版内专家分月排行榜第三
Bbs12
本版专家分:359461
版主
Blank
名人 2013年 荣获名人称号
Blank
探花 2011年 总版技术专家分年内排行榜第三
2010年 总版技术专家分年内排行榜第三
Blank
进士 2012年 总版技术专家分年内排行榜第五
Blank
金牌 2012年1月 总版技术专家分月排行榜第一
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs12
本版专家分:359461
版主
Blank
名人 2013年 荣获名人称号
Blank
探花 2011年 总版技术专家分年内排行榜第三
2010年 总版技术专家分年内排行榜第三
Blank
进士 2012年 总版技术专家分年内排行榜第五
Blank
金牌 2012年1月 总版技术专家分月排行榜第一
僵尸进程的原因以及预防方法和解决方法
现象及原因僵尸进程的常见现象,就是某些进程即使以root帐号运行 kill -9 也杀不死。之所以杀不死,是因为该进程虽然结束,但是它的内核栈(如进程描述符)依然驻留在内存中。具体形成原因,就是没有做以下3个预防方法中的任何一个。预防出现僵尸进程的方法:1. 等; 2. 不等; 3. 是孤儿而非僵尸预防办法一、在fork()/execve()过程中,在<em>父进程</em>fork()之前安装SIGCHLD信号处...
fork出的子进程父进程
一、fork后的父<em>子进程</em> 由fork创建的新进程被称为<em>子进程</em>(child process)。该函数被调用一次,但返回两次。两次返回的区别是<em>子进程</em>的返回值是0,而<em>父进程</em>的返回值则是新进程(<em>子进程</em>)的进程 id。将<em>子进程</em>id返回给<em>父进程</em>的理由是:因为一个进程的<em>子进程</em>可以多于一个,没有一个函数使一个进程可以获得其所有<em>子进程</em>的进程id。对<em>子进程</em>来说,之所以fork返回0给它,是因为它随时可以调用
为什么程序运行会崩溃
我想求一个各位数之和为9且能被5整除的五位数,想用字符数组比较方便,<em>为什么</em>运行的时候会<em>崩溃</em>呢? #include #include int main() { cha
使用CreateProcessAsUser的范例代码
-------- CreateProcessEx.h文件 -------- #ifndef _CREATE_PROCESS_EX_H_ #define _CREATE_PROCESS_EX_H_ #include  #include "tchar.h" #pragma comment(lib, "shell32") #pragma comment(lib, "user32") #pragma co
CreateProcessAsUser 使用匿名管道来输入输出的问题
http://blog.csdn.net/zpxili/article/details/6601263 类似这个程序,如果把其中的createprocess换成 <em>createprocessasuser</em>
僵尸进程产生和处理
1 什么是僵尸进程: 当<em>子进程</em>比<em>父进程</em>先结束,而<em>父进程</em>又没有回收<em>子进程</em>,释放<em>子进程</em>占用的资源,此时<em>子进程</em>将成为一个僵尸进程。如果<em>父进程</em>先退出 ,<em>子进程</em>被init接管,<em>子进程</em>退出后init会回收其占用的相关资源。2 怎样来清除僵尸进程: 1.改写<em>父进程</em>,在<em>子进程</em>死后要为它收尸。具体做法是接管SIGCHLD信号。<em>子进程</em>死后,会发送SIGCHLD信号给<em>父进程</em>,<em>父进程</em>收到此信号后,执行waitp
父进程在退出时所有的子进程连同用system启动的进程一同退出
1.system函数的实现 int system(const char * cmdstring) {   pid_t pid;   int status;   if(cmdstring == NULL){              return (1);   }   if((pid = fork())         status = -1;
子进程继承父进程中的锁
fork函数调用会创建<em>子进程</em>,<em>子进程</em>的地址空间是在调用fork时<em>父进程</em>地址空间的拷贝。因为<em>子进程</em>地址空间跟<em>父进程</em>一样,所以调用fork时,<em>子进程</em>继承了<em>父进程</em>中的所有互斥锁、读写锁和条件变量(包括它们的状态)。     但在多线程环境中,调用fork时,<em>子进程</em>中只有一个线程存在,这个线程是调用fork函数的那个线程,其他线程都没有被拷贝。     根据上述两点,<em>子进程</em>中的锁可能被不存在的
父进程子进程、进程和线程
<em>子进程</em>继承的来自<em>父进程</em>的属性: ● ● ● ● ● ● ● ●已打开的文件描述符 ●实际用户ID、实际组ID、有效用户ID、有效组ID ●附属组ID ●进程组ID ●会话ID
问题:子进程父进程哪个先执行:【转】关于 fork 和父子进程的理解 + 【转】
关于 fork 和父<em>子进程</em>的理解    代码: #include   #include   main ()  {          pid_t pid;          pid=fork();          if (pid                 printf("error in fork!");          else if
父进程异常退出时,确保子进程退出
前言<em>父进程</em>异常退出时,如果<em>子进程</em>未退出,或者对于<em>父进程</em>的退出不知情,将会<em>导致</em><em>子进程</em>变成孤儿进程,更严重的情况是,如果<em>父进程</em>需要使用端口,而<em>父进程</em>异常退出,<em>父进程</em>再次启动时,会发现其<em>子进程</em>占用其端口。原因是,<em>子进程</em>继承了原来<em>父进程</em>的端口。因此必须保证,<em>父进程</em>异常退出是,<em>子进程</em>也能够退出。如下面的程序,对系统的system函数进行了改写。 bakRun.sh#!/bin/bash declare -i
exit会结束当前进程。但是会结束父进程子进程吗?
#include #include int main() { int n = 1; if(fork()) // father process { n += 2; printf("This is the father process%d, pid=%d\n", n, getpid()); exit(0); // while(n++ < 10) // sleep(1
LinuxC/C++编程(3)—异步清理子进程(避免成为僵尸进程)
先了解Linux中进程的一些机制: 孤儿进程和僵尸进程: 1 如果<em>父进程</em>先退出,<em>子进程</em>尚未退出,那么<em>子进程</em>会成为孤儿,这时候会被init进程领养,等到<em>子进程</em>生命周期结束后,init会作为<em>父进程</em>释放掉<em>子进程</em>所占用的资源,所以孤儿进程并没有危害; 2 如果<em>子进程</em>先退出,<em>父进程</em>尚未退出,<em>父进程</em>必须调用wait()函数释放掉<em>子进程</em>所占用的资源,如果没有这样做,<em>子进程</em>的资源将不会自动释放,成为僵尸
子进程共享的资源
先来看一个题目: 当<em>父进程</em>调用fork()创建<em>子进程</em>之后,下列哪些变量在<em>子进程</em>中修改之后,<em>父进程</em>里也会相应地作出改动? A.全局变量 B.局部变量 C.静态变量 D.文件指针 答案为D,解释如下: fork()<em>子进程</em>和<em>父进程</em>共享的资源: 打开的文件 实际用户ID、实际组ID、有效用户ID、有效组ID 添加组ID 进程组ID 对话期ID 控制终端。  设置-用户-ID标志
WIN通过子进程获取父进程ID
// ParentPid.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include // 对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个2个MFC的使用选项 ULONG_PTR GetParentProc
linux中fork函数及子进程父进程的关系 (总结的很好)
一、fork入门知识      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。     一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来
Linux 下父进程子进程的通信(pipe管道)
转自http://siqun.blog.163.com/blog/static/213496001201341231121720/ 每个进程各自有不同的用户地址空间,任 何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,I
子进程退出时会给父进程发信号吗?
<em>父进程</em>创建一个<em>子进程</em>,那么<em>子进程</em>退出时,会不会告诉<em>父进程</em>它要退出了?其实在<em>子进程</em>退出时,会给<em>父进程</em>发送一个SIGCHLD,17号信号。 那么下面用代码来验证一下: 首先要捕捉SIGCHLD信号,输出 i am %d signal ; 再创建<em>子进程</em>,在<em>子进程</em>中输出 i am child,然后退出; 在<em>父进程</em>中每隔1s输出 i am father。#include #in
linux之父子进程的输出
首先,我们来回忆一下<em>父进程</em>与<em>子进程</em>,前几节讲了如何创建<em>子进程</em>,像这样的,pid_t id = fork(); 这样我们就创建好了一个<em>子进程</em>,然而fork()函数的返回值是什么呢?这里要记住:<em>子进程</em>返回0,<em>父进程</em>返回<em>子进程</em>的pid,如果创建失败的话就返回-1.由于是<em>父进程</em>创建的<em>子进程</em>,那么<em>子进程</em>就继承自<em>父进程</em>。比如,<em>子进程</em>继承了<em>父进程</em>的数据空间,堆和栈的副本。但是,父<em>子进程</em>是不是就共享同一片地址空间
启用守护进程使子进程父进程完全分离
daemon模块, daemon是存放在raw目录下的elf文件,它是一个守护进程,保护应用不被杀死。daemon原理是fork出<em>子进程</em>之后,让<em>子进程</em>成为新的会话的领头进程,并与其<em>父进程</em>的会话组和进程组脱离,紧接着就是在<em>子进程</em>中定时去启动java层配置的任务。这里它保证PushCoreService和ChapingCoreService一直在后台运行
解答:fork()函数执行后,子进程先执行的原因。
写过fork()函数的朋友应该有经验,一般使用fork()函数后,打印执行顺序时总是<em>子进程</em>先执行。但是书上却说fork函数的<em>子进程</em>与<em>父进程</em>之间的执行顺序不确定,原因是什么? 这就涉及到内核一个技术:copy-on-write,即写时拷贝。传统的fork函数调用直接把所有资源复制给新创建的进程,简单,但是浪费!写时拷贝技术是创建新进程时推迟或者不拷贝数据的技术。新创建进程后内核并不复制整个进程的地
孤儿进程与僵尸进程的理解
题目: 下面有关孤儿进程和僵尸进程的描述,说法错误的是? 正确答案: D   你的答案: C (错误) 孤儿进程:一个<em>父进程</em>退出,而它的一个或多个<em>子进程</em>还在运行,那么那些<em>子进程</em>将成为孤儿进程。 僵尸进程:一个进程使用fork创建<em>子进程</em>,如果<em>子进程</em>退出,而<em>父进程</em>并没有调用wait或waitpid获取<em>子进程</em>的状态信息,那么<em>子进程</em>的进程描述符仍然保存在系统中。这种进程称之为僵死进程。 孤儿进程
一个循环里fork出的子进程个数
[lizhe@localhost fork]$ ./exe pid:4071 ------ 问以下代码的执行结果 #include #include #include int main(){ int pid=0; for(int i=0;i,pid); pr
进程管理:通过父进程ID获取子进程ID
为了提高效率,充分利用资源,需要采用多线程,多进程的设计。在网络通信程序中,无论是客户端,还是服务端,功能稍微扩展一下,基本上不可避免的要使用多线程,多进程。遇到一个需求,需要检测<em>父进程</em>A(Process A) ,创建的<em>子进程</em>B (Process B)。 其中 Process A是主程序Process Main创建的,在创建的时候可以获取Process A 的ID,因此把Process
父进程子进程
关于<em>父进程</em>与<em>子进程</em>有许多疑问,这篇仅仅是个开头,这个系列仅为自己思考,并不是成熟体系,希望大家多批评指正。 在网上搜了很多,但是都没有一个普适的解释,仅仅是what和how,而我想知道的是why,所以我自己决定总结一下。 要了解<em>父进程</em>与<em>子进程</em>的关系,首先知道进程是什么?<em>为什么</em>出现进程?<em>为什么</em>引入<em>子进程</em>的概念?怎样创建<em>子进程</em>?当<em>父进程</em>结束时,<em>子进程</em>怎么办? 一、进程是什么? 在回答之前,先表
fork创建子进程利用pipe管道通信
转自:这里。每个进程各自有不同的用户地址空间,任 何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。 如下图所示: 管道 管道是一种最基本的IPC机制,由pipe函数创建:#
子进程中调用exit()函数对标准I/O流的影响
我们知道exit()函数是用来终止程序用的,它将调用exit系统调用,将程序状态作为参数返回给内核。但是之于_exit()和_Exit(),exit()的不同之处在于,exit()在调用exit系统调用之前,它将做一些最后的处理,包括两个部分:调用由atexit()注册的终止处理程序;关闭打开的流。这里我们要讨论的是第二点。 fork() 我们都知道,由fork()创建的<em>子进程</em>是<em>父进程</em>的副
fork之后子进程到底复制了父进程什么
假定<em>父进程</em>malloc的指针指向0x12345678, fork 后,<em>子进程</em>中的指针也是指向0x12345678,但是这两个地址都是虚拟内存地址 (virtual memory),经过内存地址转换后所对应的 物理地址是不一样的。所以两个进城中的这两个地址相互之间没有任何关系。 (注1:在理解时,你可以认为fork后,这两个相同的虚拟地址指向的是不同的物理地址,这样方便理解父<em>子进程</em>之间的独立性) (注2:但实际上,linux为了提高 fork 的效率,采用了 copy-on-write 技术,fork后,这
vfork()子进程return 0对父进程的变量的影响
vfork()会产生一个新的<em>子进程</em>.但是vfork创建的<em>子进程</em>与<em>父进程</em>共享数据段.看如下代码#include #include #include #include int globVar = 5;int main(void) { pid_t pid; int var = 1,i; printf
【Linux】为什么子进程能继承父进程的环境变量?
<em>为什么</em><em>子进程</em>能继承<em>父进程</em>的环境变量? 首先考虑进程的虚拟地址空间 命令行参数和环境变量在栈之上 2.<em>子进程</em>以<em>父进程</em>为模板,拷贝PCB、虚拟地址空间 3.所以会被继承下去 ...
Linux父进程对于子进程的异步等待
<em>父进程</em><em>为什么</em>等待<em>子进程</em>     Linux中,存在多进程、多线程的服务。  进程是如何产生、如何消失的?  首先,打开Linux虚拟机或者系统的时候,系统自己建立一个init进程,这是Linux系统的基础进程,然后init进程再根据一些配置文件决定创建哪些进程,或者我们在终端自己创建一个新进程的时候,如果你有时间,你可以一直追查这个进程的祖祖辈辈,你会发现,他们都指向一个进程,那就是init进程。
进程笔记1:子进程父进程
先这几天搞多进程以及多线程通信,怎奈以前没有深接触,所以这里总结一下。 #include #include #include int glob = 6; char buf[] = "a write to stdout/n"; int main() { int var; pid_t pid; var = 88; fp
20170724_父进程子进程到底是如何执行的?
<em>父进程</em>和<em>子进程</em>到底是如何执行的?
子进程中getppid()返回值与父进程的不一致
老师要求使用fork创建一个<em>子进程</em>,并且在<em>子进程</em>中显示<em>父进程</em>的进程号和<em>子进程</em>的进程号,然后显示出当前目录下的内容,在<em>父进程</em>中显示出<em>父进程</em>的进程号和<em>子进程</em>的进程号。代码很简单,直接调用fork函数,然后根据其返回值判断在<em>子进程</em>还是<em>父进程</em>中即可。关于fork的知识点,可以参考linux中fork()函数详解(原创!!实例讲解)很快写出了程序,但是执行之后却发现了一个问题:程序代码:运行之后:按道理说应该
如何判断fork之后的子进程是否已经结束
kill(pid, 0)的返回值0表示进程存在, fork之后的<em>子进程</em>,在运行结束时被设置为僵死进程,并且会给<em>父进程</em>发送信号SIGCHLD,只要在进程中收到此信号后waitpid下就可以完全终止<em>子进程</em>。 #include #include #include #include #include #include void handle(int sig) { if (sig
父进程产生一系列子进程,每个子进程打印自己的PID然后退出。要求父进程最后打印PID。
#include #include #include //<em>父进程</em>产生一系列<em>子进程</em>,每个<em>子进程</em>打印自己的PID然后退出。要求<em>父进程</em>最后打印PID。 int main() { int num = 5; int i; pid_t pid,ret; for(i=0;i<num;i++) { p
Console 子进程 父进程
Console <em>子进程</em> <em>父进程</em>Console <em>子进程</em> <em>父进程</em>Console <em>子进程</em> <em>父进程</em>Console <em>子进程</em> <em>父进程</em>
linux 父进程中不阻塞不轮询回收子进程的两种方
在linux 中,<em>子进程</em>的正常退出后,还有一些资源没有被释放掉,一般的方式是<em>父进程</em>负责来回收<em>子进程</em>的资源,采用wait()和waitpid()函数,前者只能只能阻塞的方式等待<em>子进程</em>从其它状态变为僵尸态,后者可以以阻塞的方式或者轮询的方式来等待<em>子进程</em>的状态改变,不管是阻塞方式还是轮询方式,<em>父进程</em>必然要消耗一些时间开销来做这件事情,其实可以通过信号的用不阻塞不轮询的方式回收成为僵尸态的<em>子进程</em>,对于SI
linux下fork()父子进程之间变量共享情况
       <em>子进程</em>会拷贝<em>父进程</em>的所有资源,变量。但是<em>子进程</em>从<em>父进程</em>拷贝下的所有资源会放到一个新的地址中。父子间共享的内存空间只有代码段。        <em>子进程</em>修改一个从<em>父进程</em>中拷贝下来的变量,<em>父进程</em>中的这个变量不会改变。 <em>子进程</em>从<em>父进程</em>拷贝的内容主要有以下 用户号UIDS和用户组号GIDS 环境Environment ...
linux C : 子进程监听父进程使用的socket端口问题
前言 在cm中,有个服务程序,收到socket命令后,启动一个<em>子进程</em>。 即使<em>子进程</em>没有任何socket操作,用lsof -i :port 来查看,也会看到<em>子进程</em>在监听<em>父进程</em>开的socket端口。 如果<em>父进程</em>由于某种原因退出了(假设是<em>崩溃</em>,调试或收到了web系统的命令退出),再重启<em>父进程</em>,端口被<em>子进程</em>监听,<em>导致</em>bind失败。 因为没想到问题原因,看代码也看不出来,就搁了一段时间。...
createprocess创建进程并隐藏新进程的窗口
方法很简单,在createprocess调用时修改一下STARTUPINFO的参数,使其隐藏即可。下面是代码示例:PROCESS_INFORMATION pi;STARTUPINFO si;      //隐藏进程窗口si.cb = sizeof(STARTUPINFO);si.lpReserved = NULL;si.lpDesktop = NULL;si.lpTitle = NULL;<b
操作系统-关于fork&父进程&子进程
前言 这学期在学操作系统,目前感觉还是挺有意思的。 操作系统老师:“鼓励你们大开脑洞多试试,会有各种奇异的结果,但是最后居然都能解释出来。” 本文是根据课上讲解+自行实践写的。 测试环境:Ubuntu 正文 关于fork()的3种返回值 这里提到的fork和下面程序中使用的fork()是一个C语言库函数,不是系统调用级别的fork();它根据不同的情况会返回3种类型的值。(而系统调用级别的f...
为什么父进程不处理标准输入输出子进程会挂起(Java)?
最近写Java的多进程程序时遇到一个奇怪的问题,发现程序运行一段时间以后会自动挂起。按道理来说<em>子进程</em>和<em>父进程</em>之间是没有太大的关系的,<em>父进程</em>只是用于开启一个新的<em>子进程</em>,之后就没怎么联系了。最后查到了stackoverflow上面的一片帖子,写的不错。http://stackoverflow.com/questions/16983372/why-does-process-hang-if-the-pare
事务的隔离级别以及会出现的问题
事务的隔离级别以及会出现的问题 SQL标准定义了4类隔离级别(由低到高): 1.Read Uncommitted(读取未提交内容) 会出现的问题:一个事务在对数据进行修改但还未提交时,另一个事务读取到了修改后的数据,但因为某些原因修改数据的事务会滚了,出现了脏读; 2.Read Committed(读取提交内容,解决了出现脏读的问题) 会出现的问题:一个事务在查询数据时另一个修改数据的事务刚好提交...
linu学习笔记-父进程子进程的关系(通俗理解)
以一个简单C程序说明 代码运行环境信息: unbuntu 16.04 C程序功能解释:执行程序中,输入一个linux 指令,并得到linux指令输出结果 #include &amp;amp;quot;apue.h&amp;amp;quot; #include &amp;amp;amp;lt;sys/wait.h&amp;amp;amp;gt; int main(void) { char buf[MAXLINE]; /* from apue.h...
父进程异常退出时, 杀死所以子进程
#include #include #include #include #include #include void my_system(const char*cmd) { pid_t pid; pid = fork(); if (pid == 0) { prctl(PR_SET_PDEATHSIG, SIGHUP);
为什么fork创建子进程后,父进程中运行过的代码在子进程中不再运行了
<em>子进程</em>是<em>父进程</em>的一个完全拷贝,如何理解?<em>为什么</em>fork创建<em>子进程</em>后,<em>父进程</em>中运行过的代码在<em>子进程</em>中不再运行了?
linux的fork()函数详解 子进程复制父进程什么
#include   #include   #include   #include      void main()   {       char str[6]="hello";          pid_t pid=fork();          if(pid==0)       {           str[0]='b';           printf("子
python学习之fork 父进程子进程的理解
我觉得关于<em>子进程</em>和<em>父进程</em>还是比较难理解的,所以分成两部分来分析 一、先来理解<em>子进程</em>和<em>父进程</em>的工作原理 在Python中,使用os.fork()之后,在内存中把<em>父进程</em>的代码及内存分配情况拷贝一份生成<em>子进程</em>的运行空间,这样<em>子进程</em>的所有代码都与<em>父进程</em>一样,两个进程之间的运行是独立的,互不影响。在<em>父进程</em>中获取到的pid是<em>子进程</em>的pid号,在<em>子进程</em>中获取的pid是0,所以下程序运行出的结果可以看出,子进...
关于 fork 和父子进程的理解
关于 fork 和父<em>子进程</em>的理解   (http://blog.163.com/kingore@126/blog/static/8540871920097300284862/) 代码: #include   #include   main ()  {          pid_t pid;          pid=fork();         
Linux进程全解7——父进程wait / waitip回收子进程
以下内容源于朱有鹏《物联网大讲堂》的课程学习整理,如有侵权,请告知删除。 一、wait介绍 1、wait的工作原理 (1)<em>子进程</em>结束时,系统向其<em>父进程</em>发送SIGCHILD信号; (2)<em>父进程</em>调用wait函数后阻塞; (3)<em>父进程</em>被SIGCHILD信号唤醒,然后去回收僵尸<em>子进程</em>; (4)父<em>子进程</em>之间是异步的,SIGCHILD信号机制就是为了解决父<em>子进程</em>之间的异步通信问
父进程退出,保证子进程交由init。
最近写代码遇到fujinch
回收php-fpm在pcntl_fork后的进程
在使用了pcntl_fork后,php-fpm会产生<em>子进程</em>,这些进城不能够被php-fpm服务管理,不能够进行stop start等操作,并且<em>父进程</em>被结束后,这些<em>子进程</em>会成为孤立进程不被控制. 如果pcntl_fork使用多了,name会产生很多php-fpm的<em>子进程</em>,占用内存且不能够被回收 尝试一 修改php-fpm.conf文件的pm模式,默认为dynamic,在此修改为ondemand...
父进程子进程的变量关系
<em>子进程</em>产生时会拷贝<em>父进程</em>的值,
fork子进程时和父进程之间的文件描述符的问题
在C程序中,文件由文件指针或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符。下面重点来说下,文件描述符是如何工作的。 文件描述符相当于一个逻辑句柄,而open,close等函数则是
父进程子进程,线程之间的关系
1、父<em>子进程</em>之间的关系 关于资源:<em>子进程</em>得到的是除了代码段是与<em>父进程</em>共享的意外,其他所有的都是得到<em>父进程</em>的一个副本,<em>子进程</em>的所有资源都继承<em>父进程</em>,得到<em>父进程</em>资源的副本,既然为副本,也就是说,二者并不共享地址空间。,两个是单独的进程,继承了以后二者就没有什么关联了,<em>子进程</em>单独运行。(采用写时复制技术) 关于文件描述符:继承<em>父进程</em>的文件描述符时,相当于调用了dup函数,父
父进程wait回收子进程
《朱老师物联网大讲堂》学习笔记     学习地址:www.zhulaoshi.org wait工作原理, <em>子进程</em>结束后,系统向其<em>父进程</em>发送SIGCHILD信号, <em>父进程</em>调用wait函数后阻塞, <em>父进程</em>被sigchild信号唤醒然后去回收僵尸<em>子进程</em>, 若<em>父进程</em>没有<em>子进程</em>则wait函数返回错误,        #include        #include
进程fork()两次---解决一个进程不必等待子进程终止,也不希望子进程处于僵死状态(一般是服务器进程fork())
首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。  孤儿进程         孤儿进程是指<em>父进程</em>在<em>子进程</em>结束之前死亡(return 或exit)。如下图1所示: 图1  孤儿进程 但是孤儿进程并不会像上面画的那样持续很长时间,当系统发现孤儿进程时,init进程就收养孤儿进
调试器的原理-详解ptrace函数及fork父子进程跟踪实例
最近仔细研究了一下linux调试程序的原理.gdb是linux下最为强大的调试工具,而strace可以拦截程序执行过程中的系统调用.他们的背后都隐藏了一个强悍的支持函数ptrace().调试程序过程中我们可以单步执行,逐步检查程序的输入输出,从而判断程序错误,当然我们也可以抛弃gdb,自己实现一个"外挂程序",拦截主程序中我们感兴趣的东西,比如ssh或ftp登录密码.
linux程序设计——父进程子进程(第十三章)
13.5    <em>父进程</em>和<em>子进程</em> 在接下来的对pipe调用的研究中,将学习如何在<em>子进程</em>中运行一个与<em>父进程</em>完全不同的另外一个程序,而不是仅仅运行一个相同程序.使用exec调用来完成这一项工作.这里的一个难点是,通过exec调用的进程需要知道应该访问哪个文件描述符.在前面的例子中,因为<em>子进程</em>本身有file_pipes数据的一份副本(点击打开"fork复制进程映像"链接),所以这并不成为问题.但经过ex
僵尸进程是如何产生的?怎样避免僵尸进程的产生
僵尸进程的产生: 当一个进程创建了一个<em>子进程</em>时,他们的运行时异步的。即<em>父进程</em>无法预知<em>子进程</em>会在什么时候结束,那么如果<em>父进程</em>很繁忙来不及wait <em>子进程</em>时,那么当<em>子进程</em>结束时,会不会丢失<em>子进程</em>的结束时的状态信息呢?处于这种考虑unix提供了一种机制可以保证只要<em>父进程</em>想知道<em>子进程</em>结束时的信息,它就可以得到。 这种机制是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但
fork 子进程不继承父进程打开的文件描述符
昨天面试被问到了这个问题,没有回答上来,网上找了一下答案。解决方法是使用 clone 系统调用使用参数在复制时将<em>父进程</em>资源有选择地复制给<em>子进程</em>。下面介绍 fork vfork clone 三者的区别vforkvfork系统调用不同于fork,用vfork创建的<em>子进程</em>与<em>父进程</em>共享地址空间,也就是说<em>子进程</em>完全运行在<em>父进程</em>的地址空间上,如果这时<em>子进程</em>修改了某个变量,这将影响到<em>父进程</em>。因此,上面的例子如果改
进程学习——父进程子进程ID
今天在测试共享内存时编写了一个进程测试的代码,在调用fork函数创建<em>子进程</em>时,在<em>父进程</em>中返回<em>子进程</em>pid,在<em>子进程</em>中返回0;具体代码如下: #include #include int main() { pid_t pid; pid = fork(); //<em>父进程</em> if(pid != 0) { printf(
子进程继承父进程中互斥锁的讨论
引言 首先明确一个问题:如果一个多线程程序的某个线程调用了fork函数,那么新创建的<em>子进程</em>里是不会自动创建和<em>父进程</em>相同数量的线程的,它只是调用fork的那个线程的完整复制。并且,<em>子进程</em>会自动继承<em>父进程</em>中(包括<em>父进程</em>在调用fork之前创建的线程)互斥锁的状态。也就是说,<em>父进程</em>中已经被加锁的互斥锁在<em>子进程</em>中也是被锁住的。这就引起了一个问题:<em>子进程</em>可能不清楚从<em>父进程</em>继承过来的互斥锁的具体状态(是
Linux下父进程异步等待子进程
1. 背景知识   我们可以使用wait和waitpid函数清理僵死进程,<em>父进程</em>可以阻塞等待<em>子进程</em>结束,也可以非阻塞地查询是否有<em>子进程</em>结束等待清理(也就是轮询的方式)。采用第一种方式,<em>父进程</em>阻塞了就不能处理自己的工作了;采用第二种方式,程序实现复杂。其实,<em>子进程</em>在终止时会给<em>父进程</em>发SIGCHLD信号,该信号的默认处理动作是忽略,<em>父进程</em>可以自定义SIGCHLD信号的处理函数,这样<em>父进程</em>只需专心处理自
子进程等待父进程退出及fork使用
#include #include #include static int var1 = 1; int main(int argc, char** argv){     pid_t pid;     int var2 = 2;     int status;     pid = fork();     if(pid == -1){         exi
C++程序中如何规避子进程退出过程中出现的异常
linux下通过fork方式创建的<em>子进程</em>,在进程退出后
过拟合产生的原因和预防
1,什么是过拟合(overfitting) 简单的说就是这样一种学习现象:Ein 很小,Eout 却很大。 而Ein 和 Eout 都很大的情况叫做 underfitting。 这是机器学习中两种常见的问题。 上图中,竖直的虚线左侧是"underfitting", 左侧是"overfitting”。 发生overfitt
Python父进程退出后,子进程自动退出的办法
PR_SET_PDEATHSIG (since Linux 2.1.57) Set the parent process death signal of the calling process to arg2 (either a signal value in the range 1..maxsig, or 0 to clear). Thi
kill 命令杀死父进程和所有子进程
当一个进程有很多个<em>子进程</em>时: ps -ef | grep nginx 使用kill -TERM 8771 命令可以杀死所有的进程
fork之后,子进程父进程那继承了什么
知道<em>子进程</em>自<em>父进程</em>继承什么或未继承什么将有助于我们。下面这个名单会因为 不同Unix的实现而发生变化,所以或许准确性有了水份。请注意<em>子进程</em>得到的是 这些东西的 *拷贝*,不是它们本身。 由<em>子进程</em>自<em>父进程</em>继承到: 进程的资格(真实(real)/有效(effective)/已保存(saved) 用户号(UIDs)和组号(GIDs)) 环境(environment) 堆栈
进程的一些概念-父亲进程、子进程、僵尸进程、孤儿进程
进程有这么多的种类,那么进程之间定是有相关性的,而这些有关联性的进程又是如何产<em>生的</em>,如何衍<em>生的</em>? 就比如我们启动了终端,就是启动了一个 bash 进程,我们可以在 bash 中再输入 bash 则会再启动一个 bash 的进程,此时第二个 bash 进程就是由第一个 bash 进程创建出来的,他们直接又是个什么关系? 我们一般称呼第一个 bash 进程是第二 bash 进程的<em>父进程</em>,第
socket编程中父子进程、兄弟进程的端口问题
最近在linux下弄一些socket方面的东西,涉及到父<em>子进程</em>、兄弟进程间的端口、socket句柄的问题,主要问题集中在两个方面: 1、假如<em>父进程</em>监听A端口,那么在client端来连接,并fork<em>子进程</em>,那么<em>子进程</em>通过那个端口与client交换数据呢? 通过实验显示,还是端口A。<em>为什么</em>?端口复用技术!那么,实验是怎么做的呢?其实很简单,server端启动,在fork出<em>子进程</em>时保证每个子
父进程如何让子进程干净明白的安全退出???
最近遇到一个问题,原本希望<em>父进程</em>实时让vfork产<em>生的</em><em>子进程</em>安全退出<em>父进程</em>后,<em>父进程</em>还可正常创建<em>子进程</em>。但是遇到了第一次kill以后,安全退出;第二次重新vfork创建<em>子进程</em>,InterruptPrint线程函数接收到结束指令后程序就挂了 以下InterruptPrint是在vfork中创建的线程函数(可能在<em>父进程</em>创建更好?<em>为什么</em>),InterruptPrint是实时接收来自串口通信的指令确定让...
linux c 父进程判断子进程退出状态
<em>父进程</em>判断<em>子进程</em>退出状态 //正常退出判断 if(WIFEXITED(status)){     printf("child exit with %d\n", WEXITSTATUS(status)); } //因为某种信号中断获取状态 if(WIFSIGNALED(status)){     printf("child killed by %d\n", WTERMSIG
对于多进程,子进程继承了父进程的内容
<em>子进程</em>继承<em>父进程</em> 用户号UIDs和用户组号GIDs环境Environment堆栈共享内存打开文件的描述符执行时关闭(Close-on-exec)标志信号(Signal)控制设定进程组号当前工作目录根目录文件方式创建屏蔽字资源限制控制终端 <em>子进程</em>独有 进程号PID不同的<em>父进程</em>号自己的文件描述符和目录流的拷贝<em>子进程</em>不继承<em>父进程</em>的进程正文(text),数据和其他锁定内存(memor
Linux 进程--父进程查询子进程的退出状态
转载至文章: linux系统编程之进程(六):<em>父进程</em>查询<em>子进程</em>的退出,wait,waitpid本节目标: 僵尸进程 SIGCHLD wait waitpid 僵尸进程当一个<em>子进程</em>先于<em>父进程</em>结束运行时,它与其<em>父进程</em>之间的关联还会保持到<em>父进程</em>也正常地结束运行,或者<em>父进程</em>调用了wait才告终止。<em>子进程</em>退出时,内核将<em>子进程</em>置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便<em>父进程</em>查询子进
多进程-fork() 父进程子进程 文件描述符继承问题
http://blog.51cto.com/keren/170822在C程序中,文件由文件指针或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符。下面重点来说下,文件描述符是如何工作的。 文件...
子进程对静态变量的操作不会相互影响
一.一个进程被操作系统调入到内存中运行,其对应的进程在内存中分为代码区,数据区,堆区和栈区 1.数据区:存放全局,静态和常量 2.栈区:主要用于存放局部变量,传递参数,存放函数的返回地址 3.堆区:用户存放动态分配的对象,当你使用malloc饥饿new等进行分配的时候,所得到的空间就在堆区中 二.fork之后,<em>子进程</em>会拷贝<em>父进程</em>的数据空间,堆和栈空间,所以<em>子进程</em>中修改变量(全局变量
子进程不会完全复制父进程的地址空间,它会在父进程的地址空间中运行
vfork创建的<em>子进程</em>与<em>父进程</em>地址空间关系 存储unix编程 在《UNIX环境高级编程》一书的第八章中,有一道课后习题如下: 回忆图7-3典型的存储空间布局。由于对应于每个函数调用的栈帧通常存储在栈中,并在调用 vfork后,<em>子进程</em>运行在<em>父进程</em>的地址空间中,如果不是在main函数中而是在另一个函数中调用vfork,以后<em>子进程</em>从该函数返回时,将会发生什么情况? 作者Rich
fork一个子进程会拷贝父进程的什么
#include #include #include #include void main() { char str[6]="hello"; pid_t pid=fork(); if(pid==0) { str[0]='b'; printf("<em>子进程</em>中str=%s\n",s
父进程创建多个子进程的问题
<em>父进程</em>创建<em>子进程</em>,看起来容易,返回值x
linux的父进程子进程发kill信号例子以及对子进程的状态进行判断
先看一个<em>父进程</em>向<em>子进程</em>发kill信号例子: #include #include #include #include #include int main(int argc, const char *argv[]) { pid_t pid; int status; pid = fork(); if (0 == pid) { pri
关于linux下fork()函数的解析:子进程继续创建子进程,如何停止?
先贴代码: for(i = 0; i &amp;lt; 4; i++) { fork(); printf(&quot;a\n&quot;); } 问:一共输出多少个a?  答:30个(2+4+8+16) 先说下思路:<em>父进程</em>创建<em>子进程</em>后,fork函数是让<em>子进程</em>完全拷贝<em>父进程</em>,包括<em>父进程</em>上下文,什么意思呢?就是说<em>父进程</em>的EIP(CPU的下一条指令地址)以及变量等等一律拷贝,也就是说,<em>父进程</em>执行过的代码子进...
linux子进程知道父进程退出的解决方案
在实际开发中难免会处理进程间的关系,最常见的是父<em>子进程</em>的相互监督。<em>父进程</em>等待<em>子进程</em>,或者自进程知道<em>父进程</em>运行是否结束,以方便释放资源。本文章提供了如何实现<em>父进程</em>监听<em>子进程</em>结束的方案,以及<em>子进程</em>如何知道<em>父进程</em>退出的方案。
父进程结束后,子进程自动结束
5三/1227 Linux下让<em>父进程</em>结束后,<em>子进程</em>自动结束 在多进程编程的时候,经常会遇到这样的情况。<em>父进程</em>创建了一堆<em>子进程</em>,当遇到错误或者操作失误的时候把<em>父进程</em>关闭了,但是<em>子进程</em>还在跑,不得不一个一个地杀死<em>子进程</em>,或者使用ps,grep,awk,kill来配合批量杀死。 之前在写 xxfpm(一个PHP-CGI的进程管理) 的时候,在Linux下使用<em>父进程</em>给<em>子进程</em>信
shell浅谈之九子shell与进程处理
一、简介       I/O重定向用于捕获一个文件、命令、程序或脚本甚至代码块的输出,然后把捕获到的输出作为输入发送给另外一个文件、命令、程序或脚本等。I/O重定向最常用的方法是管道(管道符"|")。 二、详解 1、管道
Shell脚本中的return,exit 0,以及 父进程获取子进程的变量
shell脚本中,一般在脚本的函数里面使用return语句,函数中使用return语句后,表示函数执行完毕,函数中return语句后面的代码将不再执行,同时脚本将继续执行函数后的代码。但是exit 0无论在脚本中,还是函数中,一旦使用,将退出整个shell脚本。
vfork创建的子进程父进程地址空间关系
在《UNIX环境高级编程》一书的第八章中,有一道课后习题如下:回忆图7-3典型的存储空间布局。由于对应于每个函数调用的栈帧通常存储在栈中,并在调用 vfork后,<em>子进程</em>运行在<em>父进程</em>的地址空间中,如果不是在main函数中而是在另一个函数中调用vfork,以后<em>子进程</em>从该函数返回时,将会发生什么情况?作者Rich Stevens是一位大师,留下这么一题必有其深意,于是结合《深入理解计算机系统》中
子进程及时知道父进程已经退出的最简单方案
 [精彩] <em>子进程</em>及时知道<em>父进程</em>已经退出的最简单方案?http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14【发表评论】 【查看原文】 【C/C++讨论区】【关闭】要<em>父进程</em>知道<em>子进程</em>退出,这太容易了,但是要<em>子进程</em>知道<em>父进程</em>退出,可有点麻烦。      <em>父进程</em>如果退出,<em>子进程</em>如何知道呢,最笨的方法,父<em>子进程</em>之间建立socket连接,然后建立心跳,没隔1秒测试一把,当然太笨了,通过管道
linux 父进程被kill掉后子进程的状态
第一种情况: [root@qht2 ~]# ps -ef | grep httpd root 3799 1 0 10:41 pts/0 00:00:00 /usr/sbin/nss_pcache off /etc/httpd/alias root 3803 1 3 10:41 ? 00:00:00 /usr/sbin/httpd apache 3807 3803 0 10:41 ?
python中父子进程
最近在使用python中的multiprocessing模块时遇到一些问题,很多人应该遇到相同问题,简单研究下,供有需要的参考。 首先,要明白multiprocessing的出现很大程度是为了解决python GIL锁带来的多线程低效问题,其次,注意Windows上和Linux上的进程、线程行为不一致。 那么我们常遇到的问题如下: 1.<em>父进程</em>开新的<em>子进程</em>完成任务,<em>父进程</em>关闭时,必须关闭<em>子进程</em>...
文章热词 机器学习 机器学习课程 机器学习教程 深度学习视频教程 深度学习学习
相关热词 c++中使每次产生的随机数都相同 c++饥饿和死锁产生的原因以及解决方法 c++关闭子进程 android 读取文件导致anr 区块链导致显卡价格 适合学生的python教程
我们是很有底线的