《LINUX教程:SylixOS 的system使用》要點:
本文介紹了LINUX教程:SylixOS 的system使用,希望對您有用。如果有疑問,可以聯系我們。
SylixOS是一款為大型嵌入式系統設計的硬實時系統,支持使用system調用執行命令.SylixOS為了保證實時性在system的實現上和Linux有所差別,本文著重介紹SylixOS如何實現system和在使用system時必要注意的事項.
SylixOS為保證系統的實時性所以沒有實現fork功效,Linux下system是使用fork實現的.而SylixOS則通過使用內核的shell線程實現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挪用現象
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的這個功能.
在移植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", 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<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", 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? 修改后運行成果
本文永遠更新鏈接地址:
學習更多LINUX教程,請查看站內專欄,如果有LINUX疑問,可以加QQ交流《LINUX教程:SylixOS 的system使用》。