How can I escape variables sent to the 'system' command in C++?

前端 未结 5 1559
迷失自我
迷失自我 2021-01-18 18:19

This question talks about using the system command and passing variables. Here is an example it gives:

string cmd(\"curl -b cookie.txt -d test=\         


        
5条回答
  •  北海茫月
    2021-01-18 18:32

    The best way is not to use system() at all. Use fork() and exec() and friends. Here's an example:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int fork_curl(char *line)
    {
        std::string linearg("line=");
        linearg += line;
    
        int pid = fork();
        if(pid != 0) {
            /* We're in the parent process, return the child's pid. */
            return pid;
        }
        /* Otherwise, we're in the child process, so let's exec curl. */
    
        execlp("curl", "-b", "cookie.txt", "-d", linearg.c_str());  
        /* exec is not supposed to return, so something
           must have gone wrong. */
        exit(100);
        /* Note: You should probably use an exit  status
           that doesn't collide with these used by curl, if possible. */
    }
    
    int main(int argc, char* argv[])
    {
        int cpid = fork_curl("test");
        if(cpid == -1) {
            /* Failed to fork */
            error(1, errno, "Fork failed");
            return 1;
        }
    
        /* Optionally, wait for the child to exit and get
           the exit status. */
        int status;
        waitpid(cpid, &status, 0);
        if(! WIFEXITED(status)) {
            error(1, 0, "The child was killed or segfaulted or something\n");
        }
    
        status = WEXITSTATUS(status);
        /* Status now contains the exit status of the child process. */
    }
    

提交回复
热议问题