进程创建fork函数的调试[1]

 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<unistd.h>
 4 #include<stdlib.h>
 5 int main()
 6 {
 7     int count=0;
 8     pid_t pid;//此时只有一个进程
 9     pid=fork();//此时创建了两个进程
10     if(pid<0)
11     {
12         printf("error in fork!");
13         exit(1);/*fork出错退出*/
14     }
15     else if(pid==0)
16     printf("I am the children process,the count is %d,my process ID is %d\n",count,getpid());//得到子进程ID17     else
18     printf("I am the parent   process,the count is %d,my process ID is %d\n",++count,getpid());//得到父进程ID
19     return 0;
20 }
//程序运行结果如下:1 I am the parent   process,the count is 1,my process ID is 3176
2 I am the children process,the count is 0,my process ID is 3177

为什么运行结果如此呢?因为父子进程的运行次序是不确定的!
时间: 2024-10-21 10:11:16

进程创建fork函数的调试[1]的相关文章

进程创建fork 、getpid 、getppid

创建一个进程: /******************** *功能:创建一个新进程,通过复制当前进程(和父进程一样),执行的位置都一样 *pid_t:一般是16位的有符号的整型数,不够可以typedef * 返回值:非0 :“在父进程中”--->返回子进程编号 * 0 :”在子进程中“--->返回0 * -1 :失败,并设置errno * ****************/ pid_t fork(void); 父子进程区别:fork的返回值不一样 pid不同 ppid不同 未决信号(未响应的信

linux c学习笔记----进程创建(fork,wait,waitpid)

1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样. (2)为了区分父进程和子进程,我们必须跟踪fork 的返回值. 当fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则fork 的返回值有重要的作用.对于父进程fork 返回子进程的ID,而对于fork 子进程返回0.我 们就是根据这个返回值来区分父子进程的

进程创建:函数及对应包

printf:#include<stdio.h> _exit(0):#include<unistd.h> file(fd):#include<fcntl.h> clone():#include<sched.h> malloc():#include<malloc.h> 最重要的:#define _GNU_SOURCE 参考: (1)未声明的CLONE_VM的解释: http://stackoverflow.com/questions/2244934

linux 进程创建clone、fork与vfork

目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 Linux下的进程与线程相同点是都有进程控制块(PCB,具体的类是task_struct).区别在于一个有独立的进程资源,一个是共享的进程资源.除了内核线程是完全没有用户空间.进程资源包括进程的PCB.线程的系统堆栈.进程的用户空间.进程打开的设备(文件描述符集)等. Linux的用户进程不能直接被

【C/C++】多进程:子进程的创建fork()

文章结构: 进程结构 fork函数 示例代码 frok使用场景 进程结构 Linux下一个进程在内存里有三部分的数据,就是"代码段"."堆栈段"和"数据段".接触过汇编语言的人了解,一般的CPU都有上述三种段寄存器,以方便操作系统的运行.这三个部分也是构成一个完整的执行序列的必要的部分. "代码段",顾名思义,就是存放了程序代码的数据,如果机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段."堆栈段&

fork函数的基本介绍和应用

从fork()函数的角度来看,一个进程大致包括以下三点: 代码 数据 分配给进程的资源 fork()函数通过系统调用,创建一个与原来进程几乎完全相同的进程,接入点从调用fork()函数处开始.也就是两个进程在之后的步骤里可以做完全相同的事,但如果初始参数或者传入的变量不同,或者是判断条件不同,两个进程也可以做不太一样的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于孪生兄

Linux - 进程 (二) 进程创建

详细见:https://github.com/ZhangzheBJUT/linux 一 进程概述 一个进程都由另一个称之为父进程的进程启动,被父进程启动的进程叫做子进程.Linux系统启动时候,它将运行一个名为init的进程,该进程是系统运行的第一个进程,它的进程号为1,它负责管理其它进程,可以把它看做是操作系统进程管理器,它是其它所有进程的祖先进程.系统中的进程要么是由init进程启动,要么是由init进程启动的其他进程启动. 使用ps命令输出中的PPID栏给出的是父进程的进程ID,它是启动这

fork函数在内核态的追踪

1.根据搭建环境的测试流程 在虚拟机中qemu执行test_fork命令之后,程序会执行到do_fork处. 2.在ddd控制台上输入bt 命令,追踪上层函数,找到调用do_fork()的函数 可以发现上一层函数是sys_clone ,在sys_clone 处加断点,继续对函数进行分析. 3.系统执行到sys_clone处,发现在return处调用了do_fork函数.继续 追踪上层函数,找到调用sys_clone的函数.输入bt命令,发现上层函数是ptregs_clone.在entry_32.

linux中fork函数的一个小思考

1.fork函数 头文件: #include<unistd.h> 函数原型: pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 函数说明: 一个现有进程可以调用fork函数创建一个新进程.由fork创建的新进程被称为子进程(child process).fork函数被调用一次但返回两次.两次返回的唯一区别