Linux | 进程创建--fork

1、fork 函数原型:pid_t  fork(void);

函数返回值类型为 pid_t,实质是 int 类型,Linux 内核2.4.0版本的定义是:

typedef  int  _kernel_pid_t;
typedef  _kernel_pid_t  pid_t;

2、fork 函数的底层实现:

fork()、vfork()和clone()的底层均调用do_fork(),只是传递参数和标志不同。该函数定义了一个task_struct类型的指针,用来接收即将为子进程所分配的进程描述符;使用alloc_pidmap()为子进程分配pid参数;调用copy_process()方法创建子进程的描述符,并创建子进程所需的其他数据结构。

3、fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。

fork 函数调用一次,返回两次:

(1)在父进程中返回子进程的 pid

(2)在子进程中返回0

失败则返回 -1。

4、fork 函数在生成子进程时,用到了写时拷贝技术。

写时拷贝:不执行一个父进程数据段、堆、栈的完全复制,这些区域由父、子进程共享,而内核将他们的访问权限改为只读的。当任意一个进程试图修改共享内存中的数据,则内核只为修改区域的那块内存制作一个副本,并且是以虚拟存储器系统中的“一页”为单位复制。

5、僵死进程:子进程先于父进程结束,父进程没有调用 wait 获取子进程的退出码,这时,子进程就变为僵死进程。

6. fork 相关习题:

(1)程序执行后,输出了3个A;

int main()
{
    fork() || fork();
    printf("A\n"); 
}

(2)程序执行后,输出了6个A;

int main()
{
    int i = 0;
    for( ; i<2; i++)
    {
        fork();
        printf("A\n");
    }
}

(3)程序执行后,输出了8个A;(注意,输出语句后没有“\n”,数据被暂时存在缓冲区,最后全部被打印)

int main()
{
    int i = 0;
    for( ; i<2; i++)
    {
        fork();
        printf("A");  //注意 无“\n”
    }
}

 

好的,针对您的问题,我可以给您提供以下回答: 首先,我们需要分别编写求三角形面积和圆面积的两个程序。 求三角形面积的程序: ``` #include <stdio.h> #include <math.h> int main() { float a, b, c, s, area; printf("请输入三角形三边长度:\n"); scanf("%f%f%f", &a, &b, &c); s = (a + b + c) / 2; area = sqrt(s * (s - a) * (s - b) * (s - c)); printf("三角形面积为:%f\n", area); return 0; } ``` 求圆面积的程序: ``` #include <stdio.h> #include <math.h> int main() { float r, area; printf("请输入圆的半径:\n"); scanf("%f", &r); area = 3.14 * r * r; printf("圆面积为:%f\n", area); return 0; } ``` 接下来,我们需要编写一个程序来创建两个子进程,并分别执行上述两个程序。然后,父进程输出相关提示信息。 程序如下: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { int pid1, pid2, status; pid1 = fork(); // 创建第一个子进程 if (pid1 == 0) { // 第一个子进程执行求三角形面积的程序 execl("./triangle", "triangle", NULL); exit(0); } pid2 = fork(); // 创建第二个子进程 if (pid2 == 0) { // 第二个子进程执行求圆面积的程序 execl("./circle", "circle", NULL); exit(0); } // 等待子进程结束 waitpid(pid1, &status, 0); waitpid(pid2, &status, 0); printf("两个子进程执行完毕!\n"); return 0; } ``` 注意:上述程序中使用了`execl`函数来执行子进程中的程序。该函数会将当前进程替换为新的进程。因此,在使用该函数时,需要保证当前进程中的数据都已经保存或者已经提交,否则数据会丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值