linux环境c++程序调用shell返回值问题
2017-10-18 11:34
447 查看
省外结算有一个根据socket消息执行本地shell脚本的C++程序,这个程序需要获取shell脚本的执行结果,shell脚本通过echo $?来返回执行失败还是成功。
测试发现返回值不正常,自己写的小demo可以返回正常执行结果,但是在admserver中无法正常获取。
调试发现是程序中忽略了子进程的信号signal(SIGCLD, SIG_IGN);而调用shell脚本的popen函数内部实现机制,导致无法正常获取popenfork的子进程的返回结果。
因为admserver每接收到一个消息,创建一个子进程去处理消息,处理完退出,所以要用waitpid回收退出的子进程,否则每处理完一个消息就会有一个僵尸进程。
修改办法:
signal(SIGCLD, UserChildTerm); 捕获子进程信号
void UserChildTerm(int signo)
{
signal(SIGCLD,UserChildTerm);
int status;
int pid = waitpid(-1, &status, WNOHANG);
if (WIFEXITED(status)) {
//printf("The child %d exit with code %d\n", pid, WEXITSTATUS(status));
}
}
脚本: ffcs_scp_bin.sh
#!/bin/bash
bin_path=/home/zhjs/settle/bin/
scp ${bin_path}$1 zhjs@$2:${bin_path}
echo $?
admserver调用shell的代码
FILE *fpss;
fpss = popen(Command, "r");
if(fpss != NULL)
{
char chBuffer[BUF_SIZE];
memset(chBuffer,0,sizeof(chBuffer));
fread(SendBuffer,sizeof(char), sizeof(SendBuffer), fpss);
}
测试发现返回值不正常,自己写的小demo可以返回正常执行结果,但是在admserver中无法正常获取。
调试发现是程序中忽略了子进程的信号signal(SIGCLD, SIG_IGN);而调用shell脚本的popen函数内部实现机制,导致无法正常获取popenfork的子进程的返回结果。
因为admserver每接收到一个消息,创建一个子进程去处理消息,处理完退出,所以要用waitpid回收退出的子进程,否则每处理完一个消息就会有一个僵尸进程。
修改办法:
signal(SIGCLD, UserChildTerm); 捕获子进程信号
void UserChildTerm(int signo)
{
signal(SIGCLD,UserChildTerm);
int status;
int pid = waitpid(-1, &status, WNOHANG);
if (WIFEXITED(status)) {
//printf("The child %d exit with code %d\n", pid, WEXITSTATUS(status));
}
}
脚本: ffcs_scp_bin.sh
#!/bin/bash
bin_path=/home/zhjs/settle/bin/
scp ${bin_path}$1 zhjs@$2:${bin_path}
echo $?
admserver调用shell的代码
FILE *fpss;
fpss = popen(Command, "r");
if(fpss != NULL)
{
char chBuffer[BUF_SIZE];
memset(chBuffer,0,sizeof(chBuffer));
fread(SendBuffer,sizeof(char), sizeof(SendBuffer), fpss);
}
相关文章推荐
- linux Eclipse上c++调用使用了tensorflow库的python程序遇到的问题及解决方法
- ruby调用shell问题——找不到自己环境变量中的程序
- linux下使用jni实现c++调用java程序(2)找不到java类的问题
- Linux下用C++调用Shell进行截屏
- Linux下设置时区(通过shell设置和程序中设置)及程序中设置环境变量
- c#程序调用c++编写dll需要注意问题
- 图解Linux下如何搭建C#开发环境(还能写C/C++/Java等程序,只要安装相应的插件和编译器即可)
- 关于c++调用rar程序压缩与解压的问题
- [转]浅谈C++中内存分配、函数调用和返回值问题
- Websharp框架 在Win2003环境下 WinForm程序无法调用WebService问题解决
- c语言中调用shell脚本返回值问题分析
- C/C++程序调用shell命令
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(一)
- 浅谈C++中内存分配、函数调用和返回值问题
- Linux下用eclipse写C/C++语言程序的编译问题
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(二)
- Java程序调用Linux命令时的重定向问题
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(三)