通过管道将多个字符串发送到 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
的内容未更改。
我希望 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
的内容未更改。