Linux c/c++之进程的创建

简介: 这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。

方式一: 使用system函数

特点: 当进程被创建之后,当前进程不再执行(处于挂起状态)

待被创建进程执行结束之后当前进程继续执行

被创建程序代码:

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

int main(){
    printf("先休息再工作\n");
    sleep(5);
    for (int i = 0; i < 5; ++i)
    {
        printf("子进程pid:%d\n",getpid());
    }

    return 0;
}

运行结果:

创建子进程的代码:

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

int main(){
    printf("先睡为敬!\n");
    sleep(3);
    printf("睡完了,干活儿!\n");
    system("./test.exe");
    printf("活儿干完了,继续睡!\n");
    sleep(5);
    printf("睡醒了,干饭,干饭\n");

    return 0;
}

运行结果:

方式二: 使用fork函数或vfork函数

特点: 如果当前进程为父进程,那么当父进程创建子进程之后,父子进程同时执行

fork函数创建子进程,子进程以拷贝父进程全部代码的方式来创建子进程并记录父进程的上下文(父进程运行到的位置), 父进程与子进程依据fork函数的返回值来区分

父进程fork函数返回子进程pid, 子进程fork函数返回0

代码:

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

int main(){
    printf("这是父进程,父进程id:%d\n",getpid());

    sleep(3);

    printf("开始创建子进程--->\n");

    int ret = fork();
    int n = 0;
    if(ret){
        //父进程
        printf("这是父进程pid:%d\tret:%d\n",getpid(),ret);
        while(1){
            printf("父n-->:%d\n",n++);
            sleep(3);
        }
    }else{
        //子进程
        printf("这是子进程pid:%d\tret:%d\n",getpid(),ret);
        while(1){
            printf("子n-->:%d\n",n+=2);
            sleep(3);
        }
    }

    return 0;
}

结果:

示例: 父进程打印当前时间,子进程打印随机数

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

int main(){
    char userName[25]="student";
    char passWord[25]="123456";

    char user[25];
    char pass[25];

    while(1){
        printf("请输入用户名:");
        scanf("%s",user);
        printf("请输入密码:");
        scanf("%s",pass);
        if(0 == strcmp(user,userName) &&
           0 == strcmp(pass,passWord)){
               printf("登录成功!\n");
            break;
        }else{
            printf("输入错误,请重新输入!\n");
            sleep(2);
            system("clear");
        }
    }

    int ret = fork();
    if(ret){
        //父进程打印当前时间
        struct tm* pt = NULL;
        time_t tt;
        while(1){
            tt = time(NULL);
            pt = localtime(&tt);
            printf("时间: %02d:%02d:%02d\n",
            pt->tm_hour,pt->tm_min,pt->tm_sec);

            //间隔一秒循环一次
            sleep(1);
        }
    }else{
        //子进程打印随机数
        srand((unsigned int)time(NULL));
        while(1){
            printf("随机数----->%d\n",rand()%10000000);

            //间隔半秒循环一次
            usleep(500000);
        }

    }

    return 0;
}

结果:

由此可以说明,子进程与父进程是同时运行的

方式三: 使用exec簇

exec 族函数的特征:调用 exec 族函数会把新的程序装载到当前进程中. 在调用过 exec 族函数后,进程中执行的代码就与之前完全不同了,所以 exec 函数调用之后的代码是不会被执行的

相关文章
|
1天前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
15 1
Linux C/C++之IO多路复用(aio)
|
1天前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
9 0
Linux C/C++之线程基础
|
1天前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
7 0
Linux C/C++之IO多路复用(poll,epoll)
|
1天前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
9 0
Linux C/C++之TCP / UDP通信
|
1天前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
9 0
Linux c/c++之IPC进程间通信
|
1天前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
9 0
Linux c/c++进程间通信(1)
|
1天前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
17 0
|
1天前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
6 0
|
5月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
2月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
32 1