《liNUX教程:SylixOS 的system使用》要点:
本文介绍了liNUX教程:SylixOS 的system使用,希望对您有用。如果有疑问,可以联系我们。
SylixOS是一款为大型嵌入式系统设计的硬实时系统,支持使用system调用执行命令.SylixOS为了保证实时性在system的实现上和linux有所差别,本文着重介绍SylixOS如何实现system和在使用system时必要注意的事项.
2. 原理介绍SylixOS为保证系统的实时性所以没有实现fork功效,linux下system是使用fork实现的.而SylixOS则通过使用内核的shell线程实现system功效.
2.1 linux的system功能浅析linux下system会调用fork发生子进程,由子进程execve调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程.
因为linux下是通过fork实现system,所以被执行的命令继承父系的一些资源(比如文件描述符,父系的工作路径等).同时能够实现异步执行和同步执行,同步执行即父系等待system调用运行结束(包含system调用的命令执行结束);异步即不等待,父系继续运行.
2.2
SylixOS的system原理先容#include<stdlib.h> intsystem(constchar *command); |
函数成功返回 0,失败返回-1,并设置差错码.
SylixOS的system是先创建一个内核的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 SylixOS的system功能SylixOS 的system实现原理和linux不同,功能上和linux的基原形同.
1. SylixOS实现system基础功能,挪用执行命令;
2. SylixOS 的system执行敕令可设置为同步执行和异步执行.
3. SylixOS的system承继父系进程的工作空间;
4. SylixOS中由system启动的进程承继内核线程的栈空间大小;
5.linux的system调用的三者有血缘关系,所以被system调用的进程继承父系的资源(包含文件描述符),而SylixOS的system调用的三者之间没有血缘关系,所以不能够继承父系的资源.所以SylixOS在使用system时需要注意,在技术实现章节会介绍如何实现system的这个功能.
3. 技术实现在移植linux应用程序时,在某些特定的场景上linux用户会在A进程通过system调用B进程,同时通过传参把一些文件描述符传递到B进程.因为linux下B进程承继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",file_MODE);
printf("open readfd %d writefd %d\n",iFd1,iFd2); /* * 构建system敕令字符串 */ sprintf(cBuf,"%s %d:%d","/apps/hellow/hellow",iFd2);
system(cBuf); /* 挪用system执行 */
close(iFd1); close(iFd2); printf("after system!\n"); 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\n",readfd,writefd);
if (!write(writefd,"SylixOS",sizeof("SylixOS"))) { perror("write"); return -1; } return (0); } |
在SylixOS运行成果如所示,B进程没有继承A进程的文件描述符导致报错.
图 31 SylixOS运行成果
遇到这种情况,可以通过使用posix_spawn来替换system.posix_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", file_MODE); /* 打开文件 */ iFd2 = open("test2",iFd2); #ifndef SYliXOS /* * 构建system敕令字符串 */ sprintf(cBuf,"%s %d:%d","/apps/hellow/hellow",iFd1,iFd2); system(cBuf); /* 挪用system执行 */ #else char *pcArgv[5] = { "/apps/hellow/hellow",(char *)0 }; int iRet; pID_tiPID;
sprintf(pcArgv[1],iFd2); /* 构建system敕令字符串 */ iRet = posix_spawn(&iPID, /* 启动过程 */ "/apps/hellow/hellow", 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 修改后运行成果
本文永远更新链接地址:
学习更多liNUX教程,请查看站内专栏,如果有liNUX疑问,可以加QQ交流《liNUX教程:SylixOS 的system使用》。
总结以上是内存溢出为你收集整理的LINUX教程:SylixOS 的system使用全部内容,希望文章能够帮你解决LINUX教程:SylixOS 的system使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)