通过C++和shell脚本去解析URL && c++调用shell脚本后将脚本的内容返回给程序

时间:2021-05-22 08:52:30

声明:本文是经过网络不通博主的文章综合而成的,对提供不同资料的博主表示感谢。本人仅仅是将他们的劳动成果综合到我个人的程序中。但是想到,这不仅仅是我一个人的,因此贴出来,以飨读者!

这篇文章还提供了一个思路:在用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;
}
完毕!