File failed to load: https://cdn.bootcss.com/mathjax/2.7.5/extensions/MathZoom.js

c语言中fork,exec和system函数的理解

fork

用于创建子进程。

由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,但返回两次。

  1. 在父进程中,fork返回新创建子进程的进程ID。
  2. 在子进程中,fork返回0。
  3. 如果出现错误,fork返回一个负值。

包含在<unistd.h>中,是Unix系统特有的文件(Mac os并不太清楚),因此需要用gnu标准进行编译。

fork的作用是创建一个子进程。网上有不少博客,但其中有相当一部分并没有点明fork之后会怎么样。
实验证明:fork之后的子进程不是重新运行整个程序,而是从fork处接着向后运行
比如下面的程序:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int sum=0,i;
    char cmd[1023][20], ch;
    int cnt=1, status;
    printf("before fork\n");
    while(cnt<=2) {
            pid_t id=fork();
            printf("father: id=%d, cnt=%d\n",id,cnt);
            if (id == 0) {
                printf("\e[33mSon\e[0m\n");
            }
        cnt++;
    }
    printf("\e[31mafter fork\e[0m\n");
    // printf("finally: id=%d\n",id);
    return 0;
}

其结果应该如下:(父进程和子进程之间没有固定的先后顺序,看运气)

如果画个进程运行图,应该是这样:

root

fork

dad

fork

dad

son

son

fork

subdad

son

流程如下:

  1. 程序从main进入,此时的身份我们假设为root
  2. 当运行到fork时,产生一个子进程sub1(此时cnt=1)。
    两个进程都向后运行。父进程无其它输出,子进程输出Son
  3. rootsub1都进入下一轮循环,
    此时cnt=2。这意味着rootsub1都会进行一次fork
    分别产生sub2sub3
posted @   砥安  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示