热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SylixOS的system使用

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

1. 适用范围

SylixOS是一款为大型嵌入式系统设计的硬实时系统,支持使用system调用执行命令。SylixOS为了保证实时性在system的实现上和Linux有所差别,本文着重介绍SylixOS如何实现system和在使用system时需要注意的事项。

2. 原理介绍

SylixOS为保证系统的实时性所以没有实现fork功能,Linuxsystem是使用fork实现的。而SylixOS则通过使用内核的shell线程实现system功能。

2.1      Linuxsystem功能浅析

Linuxsystem会调用fork产生子进程,由子进程execve调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。

因为Linux下是通过fork实现system,所以被执行的命令继承父系的一些资源(比如文件描述符,父系的工作路径等)。同时能够实现异步执行和同步执行,同步执行即父系等待system调用运行结束(包括system调用的命令执行结束);异步即不等待,父系继续运行。

2.2  SylixOSsystem原理介绍

#include

intsystem(constchar  *command);

函数成功返回 0,失败返回-1,并设置错误码。

SylixOSsystem是先创建一个内核的shell线程,然后通过内核的shell线程执行system需要执行的命令。

如果使用system调用执行一个进程,则同时启动一个内核线程来join等待清除该进程。如果使用system调用执行一个shell命令,则直接由内核线程t_tshell负责清除。如图 21所示,由open(pid=5)调用system执行hellow(pid=6),而内核创建一个hellow(pid=0)的内核线程join等待。

wKiom1kZoHvSaU26AAAzX4DKCJE620.png

                        图 21  system调用现象

2.3      SylixOSsystem功能

SylixOS system实现原理和Linux不同,功能上和Linux的基本相同。

1. SylixOS实现system基础功能,调用执行命令;

2. SylixOS system执行命令可设置为同步执行和异步执行。

3. SylixOSsystem继承父系进程的工作空间;

4. SylixOS中由system启动的进程继承内核线程的栈空间大小;

5.Linuxsystem调用的三者有血缘关系,所以被system调用的进程继承父系的资源(包括文件描述符),而SylixOSsystem调用的三者之间没有血缘关系,所以不能够继承父系的资源。所以SylixOS在使用system时需要注意,在技术实现章节会介绍如何实现system的这个功能。

3. 技术实现

移植Linux应用程序时,在某些特定的场景上Linux用户会在A进程通过system调用B进程,同时通过传参把一些文件描述符传递到B进程。因为LinuxB进程继承A进程的文件描述符,所以B进程便能使用A进程的文件描述符进行操作。

使用场景如程序清单 31和程序清单 32所示。

程序清单 31  A进程代码

#include

#include

 

#define PATH_LEN  20                                  /* 路径长度             */

#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) /* 创建文件的权限      */

 

intmain(intargc, char **argv)

{

    int  iFd1;

    int  iFd2;

    char  cBuf[PATH_LEN] = {0};

 

iFd1 = open("test1", O_CREAT | O_WRONLY,

                              FILE_MODE);      /* 打开文件                */

    iFd2 = open("test2", O_CREAT | O_WRONLY, FILE_MODE);

 

    printf("open  readfd %d  writefd %d\n", iFd1, iFd2);

/*

* 构建system命令字符串   

*/

sprintf(cBuf, "%s %d:%d", "/apps/hellow/hellow", iFd1, iFd2);

 

    system(cBuf);                                   /* 调用system执行        */

 

    close(iFd1);

    close(iFd2);

    printf("after system!\n");

    return 0;

}

程序清单 32  B进程代码

#include

intmain (intargc, char **argv)

{

    intreadfd;

    intwritefd;

 

    sscanf (argv[1], "%d:%d", &readfd, &writefd);    /* 解析参数,获得文件描述符      */

    printf("hellow readfd %d  writefd %d\n", readfd, writefd);

 

    if (!write(writefd, "SylixOS", sizeof("SylixOS"))) {

        perror("write");

        return -1;

    }

    return  (0);

}

SylixOS运行结果如所示,B进程没有继承A进程的文件描述符导致报错。

31  SylixOS运行结果

wKioL1kZoZfi82OGAAAa7iIXrLw318.png

      遇到这种情况,可以通过使用posix_spawn来替换systemposix_spawn函数创建子进程并继承父系的文件描述符,所以可以通过posix_spawn替换system实现。如程序清单 33所示,只需修改A进程,B进程不用修改。

程序清单 33  A进程修改后源码

#include

#include

#include

 

#define PATH_LEN  20                                 /* 路径长度              */

#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) 

                                                      /* 创建文件的权限        */

 

intmain(intargc, char **argv)

{

    int  iFd1;

    int  iFd2;

    char  cBuf[PATH_LEN] = {0};

 

    iFd1 = open("test1", O_CREAT | O_WRONLY,

                             FILE_MODE);           /* 打开文件            */

    iFd2 = open("test2", O_CREAT | O_WRONLY, FILE_MODE);

 

    printf("open  readfd %d  writefd %d\n", iFd1, iFd2);

#ifndef SYLIXOS

/*

* 构建system命令字符串   

*/

    sprintf(cBuf, "%s %d:%d", "/apps/hellow/hellow", iFd1, iFd2);     

    system(cBuf);                            /* 调用system执行              */

#else

    char  *pcArgv[5] = { "/apps/hellow/hellow", "SylixOS", (char *)0 };

    int  iRet;

    pid_tiPid;

 

    sprintf(pcArgv[1], "%d:%d", iFd1, iFd2);  /* 构建system命令字符串        */

    iRet = posix_spawn(&iPid,                 /*  启动进程                    */

                      "/apps/hellow/hellow",

                      NULL,

                      NULL,

                      pcArgv,

                      NULL);

    if (iRet != 0) {

      close(iFd1);

      close(iFd2);

      return (-3);

    }

#endif

    waitpid(iPid, NULL, 0);

    close(iFd1);

    close(iFd2);

    printf("after system!\n");

    return 0;

}

运行结果如图 32所示,运行正确。

32  修改后运行结果

#

:http://www.linuxidc.com/Linux/2017-06/144762.htm


推荐阅读
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 解决U盘安装系统后无法重启的问题
    本文详细探讨了运维新手常遇到的U盘安装系统后无法正常重启的问题,提供了从问题分析到具体解决方案的完整步骤。通过理解Boot Loader的工作原理和正确配置启动项,帮助用户顺利解决问题。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 本文详细介绍了VMware的多种认证选项,帮助你根据职业需求和个人技能选择最合适的认证路径,涵盖从基础到高级的不同层次认证。 ... [详细]
  • 本文介绍如何通过更改软件源来提前体验Ubuntu 8.10,包括详细的配置步骤和相关注意事项。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 在Ubuntu 8.04中安装美观的Cairo-Dock桌面增强工具
    本文介绍如何在Ubuntu 8.04系统中安装和配置Cairo-Dock,这款桌面增强工具以其精美的界面和高效的功能备受用户青睐。文章将指导您通过简单的步骤完成安装,并提供一些实用的配置建议。 ... [详细]
  • CentOS系统安装与配置常见问题及解决方案
    本文详细介绍了在CentOS系统安装过程中遇到的常见问题及其解决方案,包括Vi编辑器的操作、图形界面的安装、网络连接故障排除等。通过本文,读者可以更好地理解和解决这些常见问题。 ... [详细]
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
author-avatar
追梦and寻梦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有