sylixos的system使用

author author     2022-08-31     699

关键词:

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<stdlib.h>

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等待。

技术分享

                        图 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<stdio.h>

#include<stdlib.h>

 

#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 ", iFd1, iFd2);

/*

* 构建system命令字符串    

*/

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

 

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

 

    close(iFd1);

    close(iFd2);

    printf("after system! ");

    return 0;

}

程序清单 32  B进程代码

#include<stdio.h>

intmain (intargc, char **argv)

{

    intreadfd;

    intwritefd;

 

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

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

 

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

        perror("write");

        return -1;

    }

    return  (0);

}

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

31  SylixOS运行结果

技术分享

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

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

#include<stdio.h>

#include<stdlib.h>

#include<spawn.h>

 

#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 ", 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! ");

    return 0;

}

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

32  修改后运行结果

技术分享

4. 参考资料

SylixOS 应用开发手册》

TN0015_fork函数替换为SylixOS进程技术笔记》

 

本文出自 “12548035” 博客,请务必保留此出处http://12558035.blog.51cto.com/12548035/1926018

sylixos之tftp使用

1.适用范围    本文档适用于首次使用SylixOS,使用TFTP传输文件的工程师。2.TFTP命令    SylixOS的shell提供TFTP文件传输命令,使用tftp命令接收或者发送一个文件和使用tftpdpath查看或设置tftp服务器本地地... 查看详情

sylixos组播使用

1.概述      本文主要介绍如何在SylixOS上使用组播功能。2.SylixOS组播设置      组播传输,即在发送者和每一接收者之间实现点对多点网络连接通信。正常大家会参考Linux使用组播的方法... 查看详情

sylixos下内核线程简介

...程则共享使用进程内所有资源,例如进程文件描述符表。SylixOS对于一些系统级功能是通过使用内核线程进行管理使用。2.内核线程   基于SylixOS的1.5.3的内核,在终端上输入命令“ts”如图2.1所示。图2.1 “ts”命令2.... 查看详情

sylixos上ethercat实现

...mpleOpenSourceEtherCATMaster)和EtherLab的theIgHEtherCAT&reg;Master,SylixOS对两者都支持。其中IgH作为常用的EtherCAT开源协议栈,SylixOS已移植支持。 2SylixOS-IgH使用框架 &nbs 查看详情

sylixos驱动调试软件使用说明

1.适用范围   本文档适用于使用SylixOS进行驱动模块开发的客户人员和技术工程师。2.工作准备   BSP驱动开发软件;   CAN驱动模块代码;   CAN应用程序测试代码。3.原理概述   ... 查看详情

sylixos网络协议栈数据收发流程

1.SylixOS网络协议栈基本介绍   SylixOS网络协议栈使用目前非常流行的嵌入式TCP/IP协议栈lwip。lwip是瑞典计算机科学院(SICS)的AdamDunkels开发的一个小型开源的TCP/IP协议栈。lwip特点是对RAM与ROM的占用非常少,只需十几KB的RAM... 查看详情

vxworks驱动移植至sylixos总结(代码片段)

本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现。1.驱动注册与初始化1.1VxWorks中驱动注册与初始化1.1.1初始化函数VxWorks中大部分函数使用了VxWorks的VxBus结构,对于基于VxBus... 查看详情

sylixos设备ip的设置

1.适用范围 本文档适用于首次使用SylixOS,修改设备IP地址的工程师。2.命令 SylixOS的shell提供显示或配置网络信息的命令ifconfig,该命令有5种用法。如表2-1所示。 表2-1 ifconfig命令650)this.width=650;"src="http://img.blog.csdn.net/201... 查看详情

vxworks工程移植到sylixos应用笔记

...用户在RealEvo-IDE开发环境中移植Vxworks应用程序,并部署到SylixOS操作系统上运行,使用到的开发工具为RealEvo-IDE集成开发环境。2.准备工作2.1环境准备在使用之前,须安装有翼辉信息开发的集成开发套件,由于系统上安装的防火墙... 查看详情

uc/gui在sylixos下的应用

...准备1.1环境准备    在使用之前,须安装有SylixOS的集成开发套件,由于系统上安装的防火墙软件或者杀毒软件,可能会影响到集成开发软件的使用,因此,在使用本套件前请关闭计算机上的windows防火墙以及杀毒软... 查看详情

sylixos网络零拷贝技术

SylixOS网络零拷贝技术1. 网络零拷贝介绍网络零拷贝技术指的是在数据报文从网络设备到用户程序传递的过程中,一种减少数据拷贝次数,减少系统调用,实现CPU的零参与,从而减轻CPU负载的技术。1.1SylixOS网络现状SylixOS网络... 查看详情

sylixos下基于zynq-7000加载fpga程序

1、概述本文主要介绍SylixOS下基于Zynq-7000平台加载FPGA程序的方法,该方法使用的是Zynq-7000的devcfg功能模块(DeviceConfigurationInterface),该模块支持系统启动后进行FPGA程序的在线加载。2、使用方法介绍2.1工程所在目录devcfg驱动模块... 查看详情

sylixos中select原理及使用分析(代码片段)

1.select接口简介1.1select接口使用用例select是操作系统多路I/O复用技术实现的方式之一。多路I/O复用技术大致使用场景为:构造一张感兴趣的文件描述符列表,然后调用多路复用的IO接口,在接口中进行阻塞,直到这些描述符中的... 查看详情

sylixos钩子函数浅析(代码片段)

...错的选择。2钩子函数的原理本章以定时器中断为例说明SylixOS钩子的使用方法。2.1API_InterVectorIsr函数函数原型如程序清单2.1程序清单2. 查看详情

sylixos注册usb驱动模块

1概述介绍如何正确加载USB驱动模块,主要针对用户安装SylixOS之后,USB相关设备无法正常使用的情况。2注册USB驱动模块流程2.1远程登陆目标机当新安装SylixOS之后,进入系统,发现无法使用键盘、鼠标等USB设备,此时我们可以通... 查看详情

移植eigen库到sylixos下及使用方法

1.开发环境宿主机:Windows7 集成开发环境:Real-EvoIDE3.5.3 虚拟机:Ubuntu 目标机:x862.Eigen简介Eigen是一个提供了线性代数、矩阵、向量操作等运算的C++库,其中包含了很多算法。Eigen的License是MPL2,支持多平台。 Eigen... 查看详情

sylixos异常调试的手段(代码片段)

1适用范围本文档适用于希望了解当前SylixOS的调试手段的工程师。2cdump系统/应用异常调试手段2.1cdump简介cdump是SylixOS系统下的shell命令,用于系统/应用崩溃的信息记录。cdump可以将内核保存在堆中的异常信息显示出来并清空内核... 查看详情

sylixos中rtc设备驱动

1、概述本文档基于SylixOS-EVB-i.MX6Q验证平台,介绍SylixOS中RTC设备驱动实现过程,可作为在SylixOS集成开发环境下进行字符设备驱动开发的参考。  2、RTC设备驱动2.1硬件原理实时时钟(RTC)的主要功能是在系统掉电的情况下,利... 查看详情