声明:本文是经过网络不通博主的文章综合而成的,对提供不同资料的博主表示感谢。本人仅仅是将他们的劳动成果综合到我个人的程序中。但是想到,这不仅仅是我一个人的,因此贴出来,以飨读者!
这篇文章还提供了一个思路:在用C++调用shell脚本的时候,如何将脚本运行的结果返回给c++处理.
我目前希望将UTF-8格式的URL解码成原来的格式,如果完全按照C++写,那我肯定要写一个类,封装解码操作,用的时候需要:构造一个对象、调用函数、析构该对象。但是假如是shell脚本做这个事,那仅仅两行代码就好了。第二个问题是,我要将shell脚本的输出保存到我的变量中,供程序使用。
因此,首先是shell脚本的内容:
#!/bin/bash url="http://192.168.190.2/demo.cgi?method=tcp&tid=%E4%BD%A0%E4%BB%AC" printf $(echo -n $url | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n"
然后是在c++里面调用该脚本,获取运行结果。假设上面的shell脚本的名字是“url.sh”,在Linux下的完整路径是“/Data2Code/tmpTest/url.sh”
c++代码如下:
#include <pthread.h> #include <iostream> #include <string.h> #include <unistd.h> #include <stdio.h> #include <sys/wait.h> using namespace std; int mysystem(const char* cmdstring, char* buf, int len) { int fd[2]; pid_t pid; int n, count; memset(buf, 0, len); if (pipe(fd) < 0) return -1; if ((pid = fork()) < 0) return -1; else if (pid > 0) /* parent process */ { close(fd[1]); /* close write end */ count = 0; while ((n = read(fd[0], buf + count, len)) > 0 && count > len) count += n; close(fd[0]); if (waitpid(pid, NULL, 0) > 0) return -1; } else /* child process */ { close(fd[0]); /* close read end */ if (fd[1] != STDOUT_FILENO) { if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) { return -1; } close(fd[1]); } if (execl("/bin/sh", "sh", "-c", cmdstring, (char*)0) == -1) return -1; } return 0; } int main() { char p[1024]; //string url = "/Data2Code/tmpTest/url.sh"; mysystem("/Data2Code/tmpTest/url.sh",p,1024); cout<<"I realy do it"<<endl; cout<<p<<endl; return 0; }完毕!