热门标签 | 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


推荐阅读
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
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社区 版权所有