进程创建fork 、getpid 、getppid

创建一个进程:

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

父子进程区别:fork的返回值不一样

pid不同

ppid不同

未决信号(未响应的信号)和文件锁不继承

       资源利用量归0

init进程:是所有进程的祖先进程---1号进程

eg:简单创建一个子进程

/************************
 *创建一个子进程
 ***********************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    pid_t pid ;
    printf("[%d]:begin\n",getpid());
    //0.在fork前一定要刷新之前打开的流
    fflush(NULL);
    //1.创建进程
    pid = fork();
    if( pid < 0 )
    {
        perror("fork()");
        exit(1);
    }
    //2.子进程
    if(pid == 0)
    {
        printf("[%d]:child is working\n",getpid());
    }
    else
    {
        printf("[%d]:parent is working\n",getpid());
    }
    printf("[%d]:end\n",getpid());
    exit(0);
}

不加fflus有两种结果

结果1:

[root]# ./forkbase
[3862]:begin
[3862]:parent is working
[3862]:end
[3863]:child is working
[3863]:end

结果2:

[root]# ./forkbase > /tmp/out
[root]# cat /tmp/out
[3997]:begin
[3997]:parent is working
[3997]:end
[3997]:begin
[3998]:child is working
[3998]:end

*[root]# ./forkbase 输出到终端(行缓冲,加了\n刷新了缓冲区,所以begin打印了一次)

*[root]# ./forkbase > /tmp/out 重定向到一个文件,文件是全缓冲模式(\n只是换行),由于子进程继承父进程的一切,那么缓冲区就有两个begin,所以begin就会被打印2次,)

*:调度器的调度策略来决定哪个进程先运行

获取pid号:

#include <sys/types.h>
#include <unistd.h>

/********获取当前进程pid号*********/
pid_t getpid(void);

/********获取当前进程的父进程pid号*********/
pid_t getppid(void);

=======================================================================

man ps

命令ps:输出进程的一些信息

ps axf:打印进程的信息         PID         TTY         STAT      TIME         COMMAND

进程号      占据终端     状态     消耗时间     哪个命令触发的

ps axm:详细信息查看

ps ax -L :以linux特有的方式查看   LWP(轻量级进程)---线程

=======================================================================

进程号顺次向下使用

时间: 2024-10-11 04:31:31

进程创建fork 、getpid 、getppid的相关文章

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

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

进程创建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 ex

进程创建函数fork

fork fork() 调用一次返回两次:父进程返回子进程pid,子进程返回0. 进程是树形结构,子进程可随时通过getppid()获取父进程: 而父进程只能在创建时获取子进程号. 子进程使用父进程堆栈及数据空间副本等存储空间.代码正文段及文件共享,例如文件偏移量. 存储空间多采用写时复制的方式Copy-On-Write.一开始共享存储空间,直到子进程试图修改某个区域时,进行复制.复制单位一般为页大小. 常见用法: 1.父进程希望子进程复制自己,后处理不同的代码段.如网络请求,父进程等待请求,后

有意思的进程创建函数fork()的问题

在做某个公司的笔试题的时候遇到了这么一个问题,描述如下: 如下代码会输出多少个"-"字符? #include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() { int i; for(i=0;i<2;i++) { fork(); printf("-\n"); } return 0; } 在这里只做一个引子,下面稍微介绍一下fork()然后再解决这个问题

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的用户进程不能直接被

从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

一.首先我们来看看进程控制块PCB也就是task_struct,(源码) 选出task_struct中几个关键的参数进行分析 struct task_struct {volatile long state; //进程状态 /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; //进程内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 /* per process flags, defined

进程控制fork vfork

主要函数: fork 用于创建一个新进程 exit 用于终止进程 exec 用于执行一个程序 wait 将父进程挂起,等待子进程结束 getpid 获取当前进程的进程ID nice 改变进程的优先级 --------------------------------- 孤儿进程: 如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,他由init进程收养,成为init进程的子进程. #include <stdio.h> #include <stdlib.h> #includ

进程控制fork与vfork

1. 进程标识符 在前面进程描述一章节里已经介绍过进程的两个基本标识符pid和ppid,现在将详细介绍进程的其他标识符. 每个进程都有非负的整形表示唯一的进程ID.一个进程终止后,其进程ID就可以再次使用了.如下是一个典型进程的ID及其类型和功能. 进程名:swapper (交换进程),进程ID:0,类型:系统进程,作用:它是内核的一部分,不执行磁盘上的程序,是调度进程. 进程名:init(init进程),进程ID:1,类型:用户进程 ,作用:永远不会终止,启动系统,读取系统初始化的文件. 进程

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

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