通过管道将多个字符串发送到 child 进程

send several strings through a pipe to a child process

我希望 child 进程循环监听 parent 进程。如果它从 parent 接收到 "exit" 它终止,如果它接收到 "cmd" 将再次读取以使用 system() 执行实际命令。 到目前为止我有这段代码,但第二次阅读给了我相同的 ("cmd")

child:

pid = fork();
            if(pid == 0){           
            close(fd_pipe[1]);  // Close writing end
            dup2(fd_pipe[0],0); close(fd_pipe[0]);
            //close(fd_pipe[0]);

            //create file descriptor for user file
            int userFile_fd = 
            open(users_table.at(get_user(u_id)).get_filename().c_str(), O_APPEND|O_WRONLY);
            //redirect output to user file
            dup2(userFile_fd,1);
            close(userFile_fd);

            //listen in a loop till receive "exit"
            while(true){

                char buf[100];

                read (0, &buf, 100);
                cout << buf << endl;

                //logout
                if(strstr(buf, bye) != NULL){
                    cout << "Exiting..." << endl;
                    kill(getpid(), SIGKILL);
                    break;
                }

                //command
                else if(strcmp(buf, cmd) == 0){

                    read (0, &buf, 100);
                    cout << "reading buf again: "<<buf << endl;

                    system(buf);
                }
            }//end while

            }//end if (child process)

parent:


while(status == true){

    //get input
        cout << ("ucmd>");
        getline (cin, command);

//some preprocessing code and then...

        //this works fine
        else if(command.compare(logout)==0)
        {
            cout << " UM: Loggin out USER-"<<u_id<<" associated pipe ID: "<<user_pipe[u_id]<<endl;
            char exit2[] = "exit";
            write (user_pipe[u_id], exit2, sizeof(exit2));//sends exit message
        }

        //cmd
        else if(command.compare(cmd)==0)
        {   

            write (user_pipe[u_id], cmd, sizeof(cmd));//cmd command
            write (user_pipe[u_id], argument.c_str(), sizeof(argument.c_str()));//cmd command
            //call_cmd(u_id, argument);
        }

我觉得这不对:

write (user_pipe[u_id], cmd, sizeof(cmd));//cmd command
write (user_pipe[u_id], argument.c_str(), sizeof(argument.c_str()));

cmd是怎么定义的?您的代码只有在定义为固定大小的字符数组时才是正确的。第二行看起来肯定是错误的:argument.c_str() returns a char const *, 所以sizeof(argument.c_str()) will return sizeof(char const *) independent 的实际值 argument。你可以尝试这样的事情:

char const *carg = argument.c_str();
write(user_pipe[u_id], carg, strlen(carg) + 1);

这样完整的字符串(包括终止 NUL)应该被转移到 child.

那么在child我觉得你也要多加小心。你做

read (0, &buf, 100);

但随后仅使用 buf 中第一个 NUL 终止的字符串。 read操作可能读的不止这些。您应该检查 return 值。特别是,确保 read return 的值 > 0。否则可能未读取任何内容(可能有错误)并且 buf 的内容未更改。