Linux进程之-fork创建单进程\多进程

目录:

1.了解进程的相关概念

2.掌握fork/getpid/getppid函数使用

3.掌握ps/kill命令使用

4.掌握execl/execlp函数的使用

5.什么是孤儿进程、僵尸进程

6.掌握wait函数使用

7.掌握waitpid函数的使用

1、fork函数

作用:创建一个子进程

pid_t fork(void);  失败返回-1,成功返回:(1)父进程返回子进程的ID(非负);(2)子进程返回0。

pid_t类型表示进程ID,但为了表示-1,它是有符号整型。

注意返回值,不是fork函数返回两个值,而是fork后,fork函数变为两个,父子各返回一个值。

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>

int main()
{
    printf("BEGIN...\n");
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork err");
        exit(1);
    }
    if(pid == 0)
    {
        //子进程
        printf("I am a child, pid = %d, ppid = %d\n",getpid(),getppid());
        while (1)
        {
            printf("I am a child!\n");
            sleep(1);
        }
    }
    else if(pid > 0)
    {
        //父进程的逻辑
        printf("I am parent, childpid=%d, self=%d, ppid=%d\n",pid,getpid(),getppid());
        sleep(1);
    }
    printf("END...\n");
    return 0;
}

~$ gcc 02_fork.c
~$ ./a.out
BEGIN...
I am parent, childpid=22338, self=22337, ppid=13097
I am a child, pid = 22338, ppid = 22337
I am a child!
END...
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!
I am a child!

2、查看进程信息ps、杀死进程kill

ps

  • ps aux
  • ps ajx  --可以追溯进程之间的血缘关系

kill

  • 给进程发送一个信号
  • SIGKILL  9号信号
  • kill -SIGKILL pid  --杀死进程
~$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

3、循环创建多个进程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    int n = 5;
    int i = 0;
    pid_t pid = 0;
    for(i=0;i<n;i++)
    {
        pid = fork();
        if(pid == 0)
        {
            //子进程
            printf("I am child, pid=%d,ppid=%d\n",getpid(),getppid());
            break;  //子进程退出循环的接口
        }
        else if(pid > 0)
        {
            //父进程
            //printf("I am father,pid=%d,ppid=%d\n",getpid(),getppid());
        }
    }

    sleep(i);
    if(i < 5)
    {
        printf("I am child, will exit, pid=%d,ppid=%d\n",getpid(),getppid());
    }
    else
    {
        //父进程
        printf("I am father, will out, pid=%d,ppid=%d\n",getpid(),getppid());
    }

    return 0;
}

~$ gcc 03_nfork.c
~$ ./a.out
I am child, pid=24886,ppid=24885
I am child, pid=24887,ppid=24885
I am child, pid=24888,ppid=24885
I am child, pid=24890,ppid=24885
I am child, pid=24889,ppid=24885
I am child, will exit, pid=24886,ppid=24885
I am child, will exit, pid=24887,ppid=24885
I am child, will exit, pid=24888,ppid=24885
I am child, will exit, pid=24889,ppid=24885
I am child, will exit, pid=24890,ppid=24885
I am father, will out, pid=24885,ppid=22346

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值