栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

嵌入式Linux C多进程编程(四)——进程创建

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

嵌入式Linux C多进程编程(四)——进程创建

文章目录
  • 一、进程的创建(实例:读写鼠标键盘)
  • 二、exec函数族
    • 2.1 execl
      • 2.1.1 demo.c
      • 2.1.2 execl.c
    • 2.2 execv
    • 2.3 execlp
    • 2.4 execvpe
      • 2.4.1 demo.c
      • 2.4.2 execvpe
  • 三、vfork、system
    • 3.1 vfok
    • 3.2 system

一、进程的创建(实例:读写鼠标键盘)
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    pid_t pid;

    pid = fork();

    if (pid < 0)
    {
        perror("fork error!");
        exit(1);
    }

    if (pid > 0)
    {
        int fd = open("/dev/input/mouse0", O_RDWR);
        int cor = 0;
        while (1)
        {
            read(fd, &cor, sizeof(cor));
            //sleep(1);
            printf("cor = %dn", cor);
        }
        
    }
    if (pid == 0)
    {
        char buffer[1024];
        while (1)
        {
            memset(buffer, 0, sizeof(buffer));
            int n_r = read(0, buffer, sizeof(buffer) - 1);
            buffer[n_r] = '';
            printf("buffer = %sn", buffer);
        }
    }

    return 0;
}

同一文件,进程的读写位置不同,读写位置不被共享
如果在创建进程前,打开文件,则读写位置被共享

二、exec函数族

在一个进程中调用里一个程序
调用之后,原文件下面的程序会被覆盖,不予执行
要以NULL结尾

2.1 execl

int execl (const char *path, const char *arg, ..);

2.1.1 demo.c

demo

#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    for (size_t i = 0; i < argc; i++)
    {
        printf("argc[%ld] = %sn", i, argv[i]);
    }
    
    pid_t pid = getpid();
    pid_t ppid = getppid();

    printf("pid = %dn",pid);
    printf("ppid = %dn",ppid);

    char buffer[1024];
    int n_r = read(0, buffer, sizeof(1024) - 1);
    buffer[n_r] = '';
    printf("buffer = %sn", buffer);
    return 0;
}

2.1.2 execl.c
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    printf("hello worldn");
    execl("./demo","./demo","xasxa","hahaha",NULL);

    printf("快乐暑假n");
}

2.2 execv

int execv (const char *path, char *const argv[]);

#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    printf("hello worldn");
    //execl("./demo","./demo","xasxa","hahaha",NULL);

    char *arg[] = {"./demo", "hello1", "hello2", NULL};
    execv("./demo", arg);

    printf("快乐暑假n");
}

2.3 execlp

int execIp (const char *file, const char *arg,...)

#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    printf("hello worldn");
    //execl("./demo","./demo","xasxa","hahaha",NULL);

    //char *arg[] = {"./demo", "hello1", "hello2", NULL};
    //execv("./demo", arg);

    execlp("/home/jsetc/2022.7c++/多进程/demo","./demo","world1","world2",NULL);

    printf("快乐暑假n");
}

2.4 execvpe

int execvpe (const char *file, char *const argv[], char *const envp[);

env是环境变量

2.4.1 demo.c
#include 
#include 
#include 

int main(int argc, char const *argv[], char **env)
{
    for (size_t i = 0; i < argc; i++)
    {
        printf("argc[%ld] = %sn", i, argv[i]);
    }
    for (size_t i = 0; i < argc; i++)
    {
        printf("env[%ld] = %sn", i, env[i]);
    }
    
    pid_t pid = getpid();
    pid_t ppid = getppid();

    printf("pid = %dn",pid);
    printf("ppid = %dn",ppid);

    char buffer[1024];
    int n_r = read(0, buffer, sizeof(1024) - 1);
    buffer[n_r] = '';
    printf("buffer = %sn", buffer);
    return 0;
}

2.4.2 execvpe
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    printf("hello worldn");
    //execl("./demo","./demo","xasxa","hahaha",NULL);

    char *arg[] = {"./demo", "hello1", "hello2", NULL};
    char *env[] = {"UXAS = admin","PASSWD = 123","trytrytry",NULL};
    //execv("./demo", arg);

    //execlp("/home/jsetc/2022.7c++/多进程/demo","./demo","world1","world2",NULL);
    execvpe("/home/jsetc/2022.7c++/多进程/demo", arg, env);
    printf("快乐暑假n");
}

三、vfork、system 3.1 vfok

先执行子进程

如果没有exec,则会共享父进程资源,子进程一定要加exit(1)进行异常退出,不会造成二次释放

vfork比fork更节省空间
只有遇到exec的时候,才会开辟新空间

3.2 system

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号