- 浏览: 829940 次
- 性别:
- 来自: 哈尔滨
文章分类
最新评论
-
doloveme:
$sudo cp MONACO_Linux.ttf /usr/ ...
terminator 的配置 -
腾讯rep:
lowser
RSA加密算法c++简单实现 -
csuhanyong:
好YD啊,好YD
一图流:机械键盘各轴区别 -
doloveme:
1。其中:extman ,extmail下载http://ww ...
Ubuntu下安装postfix+extmail邮件服务器 -
doloveme:
repo sync出现“fatal: '../platform ...
Android 编译环境配置搭建(Ubuntu 12.04)及环境导致编译错误QA
曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入。只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位,这才是重点。当初因为这个函数风险较多,故抛弃不用,改用其他的方法。这里先不说我用了什么方法,这里必须要搞懂system()函数,因为还是有很多人用了system()函数,有时你不得不面对它。
#include <stdlib.h> int system(const char *command);
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
int system(const char * cmdstring) { pid_t pid; int status; if(cmdstring == NULL) { return (1); //如果cmdstring为空,返回非零值,一般为1 } if((pid = fork())<0) { status = -1; //fork失败,返回-1 } else if(pid == 0) { execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); _exit(127); // exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的进程就不存在啦~~ } else //父进程 { while(waitpid(pid, &status, 0) < 0) { if(errno != EINTR) { status = -1; //如果waitpid被信号中断,则返回-1 break; } } } return status; //如果waitpid成功,则返回子进程的返回状态 }
int status; if(NULL == cmdstring) //如果cmdstring为空趁早闪退吧,尽管system()函数也能处理空指针 { return XXX; } status = system(cmdstring); if(status < 0) { printf("cmd: %s\t error: %s", cmdstring, strerror(errno)); // 这里务必要把errno信息输出或记入Log return XXX; } if(WIFEXITED(status)) { printf("normal termination, exit status = %d\n", WEXITSTATUS(status)); //取得cmdstring执行结果 } else if(WIFSIGNALED(status)) { printf("abnormal termination,signal number =%d\n", WTERMSIG(status)); //如果cmdstring被信号中断,取得信号值 } else if(WIFSTOPPED(status)) { printf("process stopped, signal number =%d\n", WSTOPSIG(status)); //如果cmdstring被信号暂停执行,取得信号值 }
到于取得子进程返回值的相关介绍可以参考另一篇文章:http://my.oschina.net/renhc/blog/35116
system()函数用起来很容易出错,返回值太多,而且返回值很容易跟command的返回值混淆。这里推荐使用popen()函数替代,关于popen()函数的简单使用也可以通过上面的链接查看。
popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:
成功返回子进程的status,使用WIFEXITED相关宏就可以取得command的返回结果;
失败返回-1,我们可以使用perro()函数或strerror()函数得到有用的错误信息。
这篇文章只涉及了system()函数的简单使用,还没有谈及SIGCHLD、SIGINT和SIGQUIT对system()函数的影响,事实上,之所以今天写这篇文章,是因为项目中因有人使用了system()函数而造成了很严重的事故。现像是system()函数执行时会产生一个错误:“No child processes”。
关于这个错误的分析,感兴趣的朋友可以看一下:http://my.oschina.net/renhc/blog/54582
发表评论
-
JAVA代码混淆
2016-05-05 18:24 1453JAVA代码混淆 <!--[if !supportL ... -
android 监听状态栏被下拉
2015-12-25 17:23 3478Activity的onWindowFocusChange()方 ... -
android使用mount挂载/system/app为读写权限,删除或替换系统应用
2015-11-27 14:13 4030注意:以下代码中#开头的则为需要执行的shell命令,其他的 ... -
Ubuntu 14.04 文件服务器--samba的安装和配置
2015-11-10 10:49 640jingyan.baidu.com/album/00a07f ... -
linux生成指定大小的文件
2015-08-26 16:02 1698# dd if=/dev/zero of=50M.file ... -
intellij 打开工程在每个java文件上 有个红色的无效符
2015-07-24 13:52 1759说明该类不是可编译文件。在project Structure中 ... -
logcat命令详解
2015-07-22 16:34 985Android日志系统提供了记录和查看系统调试信息的功能。日 ... -
gradle打包遇到的错误汇总
2015-07-21 11:32 0错误1:A problem occurred ... -
Android读写XML(下)——创建XML文档
2015-04-29 11:02 618在前面的2篇文章Android读写XML(上)—— pack ... -
Android读写XML(中)——SAX
2015-04-29 10:54 625在Android读写XML(上) ... -
Android读写XML(下)——创建XML文档
2015-04-29 10:52 705在前面的2篇文章Android读写XML(上)—— pack ... -
android:configChanges locale 改语言后,该配置不起作用的原因
2015-03-23 14:38 2518@Override public void on ... -
android.app.Fragment$InstantiationException 解决办法
2015-03-23 13:46 1415android.app.Fragment$Instantia ... -
linux 查看内存
2015-02-10 13:08 7471、free监控内存使用情况 #free 2、watc ... -
android fastboot 刷机 指令
2015-01-19 18:31 1531原生bootloader:bootloader-gro ... -
[Android实例] android中进行https连接的方式的详解 (转发)
2015-01-09 15:50 699x 如果不需要验证服务器端证书, ... -
编译android源码apk是否生成odex方法
2014-10-20 17:19 1649其实Android系统默认的配置是,如果没有指定DISABL ... -
关于android源码中的APP编译时引用隐藏的API出现的问题
2014-10-20 15:36 844今天在编译android源码中的计算器APP时发现,竟然无法 ... -
Android系统进程Zygote启动过程的源代码分析
2014-09-17 10:09 506在Android系统中, ... -
Handler和HandlerThread
2014-09-16 16:58 6971.什么是Handler? SDK中关于Handler的说 ...
相关推荐
这个"UNIX/Linux下C/C++函数速查手册"提供了全面的C和C++函数参考,帮助开发者快速找到所需的函数信息,提升开发效率。以下是一些关键的知识点: 1. **C语言函数**: - **标准库函数**:C语言的标准库包括、、等...
在Linux环境下进行C/C++编程是一项重要的技能,尤其对于系统级开发者和软件工程师而言。Linux提供了丰富的工具和库,使得C/C++程序员可以充分利用操作系统的能力。以下是一些关于"Linux C/C++超有用"的知识点: 1. ...
这个方法不会在Java源代码中实现,而是要在C/C++代码中实现。例如: ```java public class JNICBridge { static { System.loadLibrary("jnibridge"); } public native void callFromJava(); } ``` 这里,`...
5. **编译C/C++代码**:使用C/C++编译器(如GCC)将源代码编译为动态链接库(Windows上是.dll,Linux上是.so,Mac上是.dylib)。确保链接时包含JVM的库。 6. **运行Java程序**:最后,你可以在Java程序中调用`...
"Linux-system-functions.rar"这个压缩包文件显然包含了关于Linux系统函数的详细信息,这对于理解和使用Linux系统服务进行C++编程至关重要。以下是根据标题、描述以及可能包含的文件内容提炼出的一些关键知识点: 1...
JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的.dll或Linux下的.so文件)。JNI框架包括了Java端的本地方法声明和本地方法实现,以及C/C++端的...
标题中的"java写的一个使用jni调用c/c++的dll"意味着我们要创建一个Java项目,该项目包含一个或多个`native`方法,这些方法的实现将在C/C++中完成。接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了...
这里的`callCppFunction`是需要在C/C++中实现的函数,`System.loadLibrary("myDll")`加载名为"myDll"的动态链接库。 3. **生成JNI头文件** 使用`javah`工具(在JDK的bin目录下)生成C/C++的头文件。例如: ``` ...
将C/C++源代码编译为动态链接库(Windows下为`.dll`,Unix/Linux下为`.so`)。 5. **加载库文件**: 在Java程序中加载动态链接库,可以通过`System.loadLibrary()`方法指定库文件名。 ```java public class ...
本项目旨在使用C/C++编程语言重新实现`ls`命令的核心功能,不依赖于`system`函数或`exec`系列函数。下面将详细阐述如何通过C/C++来实现这些功能。 首先,我们需要理解`ls`命令的基本用法和各个选项: 1. **-l**:...
通过以上介绍和示例代码分析,我们可以看到在Linux C程序中使用`popen()`函数来获取shell命令的输出是一种非常实用且高效的方法。它不仅可以简化代码逻辑,还能提高程序的可维护性和扩展性。对于那些需要频繁执行...
在Linux中,可以使用`setuid`和`setgid`函数来改变进程的身份,或者使用`capabilites`机制来赋予进程特定的能力。例如,以下代码将使进程具有CAP_SYS_ADMIN能力,这相当于root权限的大部分功能: ```cpp #include ...
你需要创建一个类实现这个接口,并声明你想要调用的C/C++函数。例如,如果你有一个名为`mylib`的C库,其中包含一个名为`addNumbers`的函数,你可以这样定义: ```java import com.sun.jna.Library; import ...
C 和 C++ 语言都是世界上最流行且使用最普遍的编程语言, 因此 Eclipse 平台(Eclipse Platform)提供对 C/C++ 开发的支持一点都不足为奇。 因为 Eclipse 平台只是用于开发者工具的一个框架,它不直接支持 C/C++;它...
在Linux中,可以使用`system()`函数或者`popen()`来执行命令行操作,例如`pgrep`命令来查找指定的进程。 ```cpp #include #include #include bool isProgramRunning(const std::string& programName) { std::...
在探讨C++中的清屏函数之前,我们先回顾一下C语言中的清屏操作。在C语言中,`clrscr()` 函数通常用于清除屏幕上的输出,该函数来源于非标准库 `conio.h`。不过,在C++环境中,情况有所不同。由于 `conio.h` 并不是...
3. **编译并链接**:编译C/C++源代码,并将其链接成动态链接库(Windows下为.dll,Linux/Unix下为.so)。 4. **复制库文件**:将生成的动态链接库复制到Java程序的运行路径下。 5. **调用本地方法**:在Java程序中...
本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态链接库)中的函数。 首先,JNI是Java官方提供的原生接口,允许Java代码直接与本地代码交互。在Java中...
在Linux环境下进行C++编程,编译是必不可少的步骤。这里我们将详细讲解如何在Linux系统中编译C++源代码,以及涉及的相关知识点。 首先,你需要一个C++编译器,通常选择的是GNU Compiler Collection (GCC) 的C++版本...
2. **刷新屏幕**:使用C库中的`system("cls")`(Windows)或`system("clear")`(Linux)清屏,然后重新打印迷宫地图。 3. **动画效果**:通过延时函数(如C++的`std::this_thread::sleep_for`)实现简单的动画效果...