Python 中fork进程的问题

Python代码如下:

 for i in range(0,2):
    print("#i=%s, who:%s" % (i, os.getpid()))
    pid = os.fork()
    if pid == 0:
        print("i=%s in child process, pid=%s, parent_pid=%s" % (i, os.getpid(), os.getppid()))
    elif pid > 0:
        print("i=%s in parent process, pid=%s, child_pid=%s" % (i, os.getpid(), pid))
    else:
        print("Error")

运行结果:

 Process (3159) start...
#i=0, who:3159
i=0 in parent process, pid=3159, child_pid=3161
#i=1, who:3159
i=1 in parent process, pid=3159, child_pid=3162
i=1 in child process, pid=3162, parent_pid=3159
i=0 in child process, pid=3161, parent_pid=3159
#i=1, who:3161
i=1 in parent process, pid=3161, child_pid=3163
#i=0, who:3160
i=0 in parent process, pid=3160, child_pid=3164
#i=1, who:3160
i=1 in parent process, pid=3160, child_pid=3165
i=1 in child process, pid=3163, parent_pid=3161
i=0 in child process, pid=3164, parent_pid=3160
#i=1, who:3164
i=1 in parent process, pid=3164, child_pid=3166
i=1 in child process, pid=3165, parent_pid=3160
i=1 in child process, pid=3166, parent_pid=3164

求大神指点下进程创建的过程,为什么是6次。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
python中fork创建新的进程
为了了解其中工作原理, 在结合linux的查看进程ps命令,对进程做了进一步的理解:1、在linux下运行.py文件,系统就会创建一个进程# coding=utf-8 from time import sleep sleep(30)在linux终端下执行命令:python /home/lilong/桌面/fork_using.py & 加上&符号,可以让程序在后台运行,不会占用终端。输入ps -l
python中使用fork创建新的进程
fork知识入门  python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之间的执行是相互独立的,其执行顺序可以是不确定的、随机的、不可预测的,这点与多线程的执行顺序相似。import os import timetry: forkpid = os.fork() time.sl
fork()复制进程的问题。
我的问题:为什么下面的程序输出文件内容是rnTest 1 2 3 ..rnHello, hellornTest 1 2 3 ..rnHello, hellornrn"Test 1 2 3.." 不是在fork()调用之前的已经输入到文件了吗,为什么会出现两次的?rnrn程序如下:rn#includernint main()rnrn FILE *fp;rn int pid;rn char msg1[]="Test 1 2 3 ..\n";rn char msg2[]="Hello, hello\n";rn if((fp=fopen("testfile2","w"))==NULL)rn return 0;rn fprintf(fp,"%s",msg1);rn if((pid=fork())==-1)rn return 0;rn fprintf(fp,"%s",msg2);rn fclose(fp); rn return 1;rn
fork复制进程问题
fork会复制父进程malloc的内存吗? rnfork会复制父进程全局数组吗?rnrnvfork呢?
fork进程
任务队列是一个双向循环链表 产生进程机制:fork() + exec() //exec:负责读取可执行文件并将其载入地址空间中运行 fork()使用写时拷贝实现, 只有在需要写入时,数据才会被复制,从而使各个进程拥有各自的拷贝 fork()之后,子进程先执行(内核有意选择子进程先执行),因为一般子进程都会马上调用exec()函数,这样可以避免写时拷贝的额外开销,如果父
进程fork()
进程的创建: pid_t fork(void);系统调用函数 fork出错 返回-1,fork函数调用一次,返回两次 在原来的进程返回新进程pid(不可能为0),在新进程中返回0; 即在父进程执行非0,在子进程执行0 #include<stdio.h> #include<stdlib.h> #include<string.h> #inclu...
进程fork
进程简介 linux是一个多任务操作系统,这也是与单片机最大的区别,它可以运行多个程序,每个程序都是一个进程,当然一个程序也可能包含多个进程。不同用户在同一操作系统运行的同一个进程,共享一个函数库与程序代码。 在终端输入ps -ef 命令,可查看所有运行的进程 每个进程都有唯一的PID,可以看到PID为1的特殊进程叫做init进程,负责管理其他进程。 进程调度 创建进程fork,vf...
fork一个进程,fork()函数fork()函数
fork一个进程,fork()函数fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,这个新产生的进程称为子进程。一个进程调用fork()函数后,系统先给新的进程...
进程编程中的fork起步
进程编程中的fork起步父子进程的关系  使用fork(或者其他能创建子进程的API)函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、代码段、数据段、以及PCB和内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。      子进程与父进程的区别在于:   (1)父进程设置的锁,子进程不继承   (2)P
python中进程创建—fork()
导入模块:import os   1.程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),复制父进程信息 2.子进程从fork()函数中得到返回值零 3.父进程从fork()函数中得到返回值子进程的id 4.fork()函数调用一次,返回两次 5.一个父进程可以fork出很多子进程 6.子进程调用自己id用函数getpid() 7.子进程调用父进程的id用函数
fork()复制进程的问题2
谢谢指教.rn为什么程序的输出不是 20 个 "stll here..\n" 而是 9个?rn程序:rn[code=C/C++]rnint main()rnrn int i;rn if(fork()!=0)rn exit(0);rn for(i=1;i<=10;i++)rn rn printf("still here..\n");rn sleep(i);rn rn return 0;rnrn[/code]
linux fork()进程ID问题
[img=https://img-bbs.csdn.net/upload/201604/12/1460450792_325986.png][/img]rnrn子进程的ppid 不是应该和父进程的pid相同吗 为什么一直不一样
一个关于fork进程的问题
很简单的一段代码:rn#include rnrnint main(int argc , char **argv)rnrn int i;rn int pid;rnrn for ( i = 0 ; i < 3; i++ )rn rn if ( (pid = fork()) == 0 )rn rn printf("# Parent : %d # Child : %d ## fork print is : %d\n" , getppid() , rn getpid() , i);rn rn rnrn该程序编译运行后结果如下:rn[sybase]/export/home/sybase/lrj/bin> fork_testrn# Parent:9228 # Child:9229 ## fork print is : 0rn# Parent:9228 # Child:9230 ## fork print is : 1rn# Parent:9228 # Child:9231 ## fork print is : 2rn[sybase]/export/home/sybase/lrj/bin> # Parent:9229 # Child:9232 ## fork print isrn : 1rn# Parent:9230 # Child:9233 ## fork print is : 2rn# Parent:9229 # Child:9234 ## fork print is : 2rn# Parent:9232 # Child:9235 ## fork print is : 2rn(不出现命令行提示符,光标停在此处)rnrn并且每次运行该程序结果不一样。rnrn本人很想知道的是:这个程序(主要是fork()调用)的运行机制到底是怎样的,才会出现上述的结果?
(二十二)进程——进程原语fork
fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(ChildProcess)。而一个进程包括代码、数据和分配给进程的资源,所以fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,一个进程调用fork()函数后,系统先给新的进程分配资源,包括存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中。相当于
测试python的fork进程的小程序
[crsusr@rws1270149 python_study]$ cat mypy02.py #!/usr/bin/python3.7 import sys,string,os,glob,time #from os import * def parent(): pid = os.fork() if pid == 0: print("from child",os...
Python基础(七)系统编程之进程-fork
1.进程的创建: fork():Python的os模块封装了常见的系统调用。,调用fork( )函数就可以创建子进程 普通函数调用一次,返回一次,fork()调用一次,返回两次。操作系统自动把父进程复制一份,分别在父进程和子进程内返回。 注意:fork()函数只在unix/linux/Mac上运行,Windows上不可以运行。 import os pid = os.fork()    
linux新建进程--fork
fork用于创建新进程,新进程与原进程具有从属关系,原进程称之为父进程,新建进程称为子进程,此进程还有其他什么关系呢? 1. 进程号 子进程的父进程应该为原进程,原进程的子进程应该为新建的进程号。 2. 返回值 使用fork新建进程返回值有三种,出错返回-1,0返回给子进程 ,大于0的正整数返回给父进程。 3. 数据共享 子进程会复制父进程的所有数据,在
操作系统fork()进程
1、fork()是创建进程函数。 2、c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程。 3、此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码。 4、需要注意!!!子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID(地址);一个代表子进程,值为0。 下面写一段代了...
fork进程相关
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <signal.h> int main(int argc, char *argv[]) { pid_t pid; int i = 0;
进程fork和vfork的区别
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sys/type.h&gt; int main() { int count = 1; int child = fork(); if(child &lt; 0) { perror("fork error"); } else if(child == 0) { ...
C++进程学习:fork
每个进程都有一个进程控制块(PCB)来维护进程相关信息,Linux内核的进程控制块是task_struct结构体,主要包含以下信息:     。进程 id。系统中每个进程有唯一的 id,在 C 语言中用 pid_t 类型表示, 其实就是一个非负整数。 ·  。进程的状态,有运行、挂起、停止、僵尸等状态。 ·  。进程切换时需要保存和恢复的一些 CPU 寄存器。 ·  。描述虚拟地址空间的
进程与系统调用——fork、exec
C程序无论做什么事都要靠操作系统。例如它想与硬件打交道,就要进行系统调用。系统调用是调用操作系统内核中的函数,C标准库中大部分代码都依赖于它们。例如调用printf()函数在命令行显示出字符串时,C程序都会在背后向操作系统发出系统调用,把字符串发送屏幕显示。 例如system函数: #include &amp;amp;amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;amp;amp;gt; int main(){ system(&amp;amp;
进程的创建-------fork与vfork
目录 fork函数 fork的使用 vfork函数 fork() 与 vfock() 都是创建一个进程,那它们有什么区别呢? 进程的正常终止方法? 进程的异常终止 为什么vfork()子进程中可以调用_exit(),却不可以调用exit(),也不可以直接return呢? fork函数 fork的使用 头文件  #include&amp;lt;unistd.h&amp;gt; 函数原型  pi...
fork() 创建10个进程
#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int main(int argc, char const *argv[]) { pid_t pid = fork(); int parent_id; if(pid&amp;gt;0){ parent_id = getpid(); child_cnt=1; } else if(pi...
Linux系统编程-----进程fork()
在开始之前,我们先来了解一些基本的概念: 1. 程序, 没有在运行的可执行文件 进程, 运行中的程序 2. 进程调度的方法: 按时间片轮转 先来先服务 短时间优先 按优先级别 3. 进程的状态: 就绪 -&gt;&gt; 运行 -&gt;&gt; 等待 运行 -&gt;&gt; 就绪 //时间片完了 ...
fork(三进程替换)
进程替换:exec指定一个程序把全新的程序加载到子进程中,子进程将会指向新进程   exec每个函数都有返回值,只有出错时返回值才会有效,正确时会被覆盖掉,也就没人接收了 exec可以不用判断,拿到返回值就已经代表出错, int execl(char* pathname,char *argv0,char* argv1………..(char*)0)。/第一个参数是可执行文件的路径加名称/当前目录...
【Linux】进程的创建fork()
进程的创建:        1)fork()创建一个新进程。子进程会得到父进程中数据段,栈段和堆区域的一份拷贝。子进程独立可以修改这些内存段。但是文本段是子进程和父进程共享的内存段,不能被子进程修改 fork()---进程一分为二《父进程-父进程(id!=0)、子进程(id==0),出错(id=-1)》        2)vfork()创建一个新进程,子进程会立即即调用exec,于是不会
fork、内存泄漏、进程
1.系统调用  fork:复制进程 Pid_t  fork(void); Pid_t:int    pid:进程的编号(id标识符) 父子进程并发运行 并行:一种特殊的并发,不是交替,我在执行的同时,你也在执行。两个处理器 并发运行:一个处理器。在一段时间内交替运行,从长远角度看是同时运行。 fork: 先复制PCB,再把实体复制一份; 父进程返回的fork值是子进程的pid,子进
进程fork处理
进程或者线程创建do_fork   /* For compatibility with architectures that call do_fork directly rather than  * using the syscall entry points below. */ long do_fork(unsigned long clone_flags,        unsigne
创建一个进程:fork
<span style="color:#3D3D3D;">本课程是《嵌入式工程师自我修养》自学视频教程系列,嵌入式学习6步走中的第3步:Linux系统编程第04期。</span><br /><span style="background-color:#FFFFFF;">主要学习重点:进程的创建、执行、控制运行、退出等,进程与终端之间的关系,Linux中的进程全景图</span>
linux进程fork——写时复制
fork到底复制了父进程的哪些资源? 我们来看一个例子 #include&amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;unistd.h&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;sys/wait.h&amp;amp;am
小记——fork与进程
在linux系统中, fork系统调用用于新建一个进程。 进程退出相关 1.      void exit(int status), 进程退出,并且返回status & 0377给父进程 2. int atexit (void (*function)(void));用于注册进程退出时要执行的动作,执行顺序与注册顺序相反。由编译器完成这项工作。 3. int on_exit (void (*
操作系统之进程(kill ,fork)
fork函数 返回值:fork仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值 (1)在父进程中,fork返回新创建子进程的进程ID;(2)在子进程中,fork返回0;(3)如果出现错误,fork返回一个负值; 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。 在子进程中,fork函数返回0,在父进程中,fork返回新创
多次fork问题(python 版)
如果在一个程序,有2次的fork函数调用,是否就会有3个进程呢? #coding=utf-8 import os import time # 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() if pid == 0: print('哈哈1') else: print('哈哈2') pid = os.fork(
Linux中fork()复制进程的使用__2018.06.10
代码: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; int main() {   pid_t pid; pid=fork(); if(pid==0) { printf(&quot;这是子线程,pid=%d\n&quot;,getpid()); } else if(pid&amp;gt;...
进程的创建之Unix环境fork一个进程
如果运行的是父进程,则返回的pid号为非负,如果为子进程,pid返回为0,在Unix系统中,父进程创建子进程之后,先运行子进程,再执行父进程int main(){pid_t  pid;pid=fork();//创建子进程if(pid&amp;lt;0){fprintf(stderr,&quot;Fork Failed&quot;);exit(-1);}else if(pid==0){execlp(&quot;/bin/ls&quot;,&quot;ls&quot;...
GitHub中fork的问题
之前fork过一个linux,之后用github的网页版Delete this repository删除了。然后通过git clone git@github.com:我的用户名/linux仍可以下载代码。而且也无法再fork torvalds / linux了。这是怎么回事呢?
关于fork()进程的一个简单问题!!!!!!!!!!!!!!!!
[code=C/C++]rn rn rn #include rn #include rn int main() rn rn char buf[3]="AB"; rn char *str=buf; rn if(fork()>0) rn wait(); rn else rn *str='M'; rn printf("%x:%s\n",(unsigned int)str,str); rn return 0; rn rn rn rn [/code]rnrnlinux2.6环境下编译运行,结果是:rnbfc807bd:MBrnbfc807bd:ABrn我的疑问是:rnrn子进程和父进程输出的str 地址都是bfc807bd,子进程修改了bfc807bd内存单元的值,为什么父进程输出的还是AB??rn在父进程创建子进程后,子进程获得父进程的一个副本,包括数据段,栈空间,指令段等,既然str指向的都是同一个地址,为什么数据不同? 难道与进程的虚拟地址空间有关?rn
Linux系统编程关于fork进程的问题!
[code=c]#include rn#include rn#include rn#include rn#include rnrnint main()rnrn pid_t pid;rnrn if((pid = fork()) < 0) /*fork fail*/rn perror("first fork err");rn exit(1);rn else if(pid == 0) /*first child*/rn if((pid = fork()) < 0)rn perror("second fork err");rn exit(1);rn else if(pid > 0) /*parent for second child == first crnhild*/rn exit(0);rn rn sleep(2); /*second child*/rn printf("second child,parent id = %d\n", getppid());rn exit(0);rn rnrn if(waitpid(pid, NULL, 0) != pid)rn perror("waitpid err");rn exit(1);rn rnrn exit(0);rn[/code] rn运行结果 rn./a.out rnsecond child,parent id = 1326rnrn为什么第二个子进程的父进程的进程ID没有变为0???它的父进程已经结束运行了啊。rn
关于fork使用进程的问题,懂得请进来!
一个程序可以多次调用fork。类似地,每个子进程都可以使用fork来繁殖自己的“孩子”。为了证明这一点,编写一个程序,创建两个子进程。每个子进程再创建一个它们自己的子进程。在每个fork之后,每个父进程应使用printf来显示其后代进程的的进程id。rnrn假设A创建了B和C,B创建了D、E,C创建了F、G,这程序不好写,我不明白怎么D、E、F、G是怎么知道它的父进程是谁啊?请会的人给个C语言的描述吧。
相关热词 c# 线程顺序 c#昨天当前时间 c# 多进程 锁 c#mysql图片存取 c# ocx 委托事件 c# 读取类的属性和值 c# out 使用限制 c#获取url的id c#怎么进行分页查询 c# update 集合