Linux创建新进程来模拟socket服务

父进程循环等待客户端的接入,fork()创建子进程去处理请求
实现代码如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t   pid;
    int data = 100;

    while(1)
    {
        printf("please input a data \n");
        scanf("%d",&data);

        if(data == 1)
        {
            // fork 创建一个子进程,如果用户输入的1,则父进程和子进程都会执行下面的代码
            pid = fork();
            if(pid > 0)
            {
                //父进程不做任何动作,主要看子进程的执行内容
            }else if(pid == 0){
                while(1)
                {
                    printf("do internet request\n");    //子进程去处理用户的请求
                    sleep(3);
                }
            }
        }else{
            printf("do nothing\n"); //如果用户输入的不是1,则父进程一直等待新的用户接入
        }
    }
    return 0;
}
//执行结果如下:
/*please input a data 
6
do nothing
please input a data 
5
do nothing

//只有在输入1时,子进程才会执行
please input a data 
1
please input a data 
do internet request
do internet request

2
do nothing
*/
怎么理解进程?
进程的相关概念

程序跑起来系统就多了一个进程。
同一程序多次执行会对应多个进程。

使用fork()函数创建一个进程,fork()函数调用成功,返回两次——返回值为0,代表当前是子进程;返回值为非负数,代表当前进程为父进程;调用失败返回-1。

调用fork()函数之后,两个函数同时执行fork()函数之后的代码,也就是子进程和父进程都会执行一遍fork()函数之后的代码,而之前的代码只是父进程在跑。子进程的PID = 父进程的PID + 1。

fork()之后两个进程可以做完全相同的事情,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事情。如fork()之后有if判断语句,若是pid == 0,打印“i am child";若pid > 0,打印"i am father"。这样父子进程还是会有少数值是不相同的。

父进程的返回值是新的子进程的ID。将子进程ID返回给父进程的理由:一个进程的子进程可以有多个,并且没有一个函数可以使一个进程获得其所有子进程的进程ID。

子进程得到返回值0的理由:一个进程只会有一个父进程,所以子进程通过调用getppid()总是可以获得父进程的进程ID。0是由内核交换进程使用。

进程创建发生了什么?
C程序的存储空间是如何分配的?

旧时Linux实行全拷贝:代码段、数据段(初始化的数据和未初始化的数据)、堆栈、IO流的拷贝。子进程如果要对数据进行更改,由于拷贝时是把父进程完全复制了一份——注意子进程得到的是副本,父子进程不共享存储空间,所以数据更改只对子进程本身起作用,不会影响到父进程的数据。

后期写时拷贝。子进程要改变父进程的数据时,只会把对应的数据进行拷贝。这些区域由父子进程共享,而且内核将他们的访问权限改变为只读。

fork创建子进程的目的
父进程希望复制自己,使父子进程同时执行不同的代码段。
  •  例如:在socket网络服务进程中,父进程等待客户端的接入。当服务请求到达时,父进程fork一个子进程去对接此请求,而自己则继续等待下一个服务请求的到达。
  •   创建新进程的实际应用场景

        通过从键盘获取用户输入来模拟socket服务进程。父进程不断等待客户端的接入,当用户输入数字为1 时,创建子进程去响应客户端的请求。代码如上。

一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值