English 中文(简体)
书写我自己的炮弹...... st在管道上?
原标题:Writing my own shell... stuck on pipes?
  • 时间:2009-09-22 17:06:29
  •  标签:

在过去几天里,我一直在试图写一下我自己的炮弹,但我似乎 st忙地把管道带上来,以便妥善工作。 我能够把管道(ex: ls ́ ́)分开,从管道(ex: ls ́ >)上 for,但似乎可以让管道从管道中投入。

我认为,我根本不理解如何妥善使用管道和管道。

我现在包括我仍在失败的法典: Souck...

void forkAndExecute( char* arrayOfWords[] , vector<pid_t> *vectorOfPIDs , bool hasNextCmd , bool hasPrevCmd) {

int fd[ 2 ];
pid_t pid;

if( hasNextCmd ){
    pipe(fd);
iii

pid = fork();

//error if PID < 0
if( pid < 0 ) {
    cerr << ">>> fork failed >>>" << endl;
    exit(-1);
iii
//child process if PID == 0
else if( pid == 0 ) {
    if ( hasPrevCmd ){
        dup2(fd[0] , 0);
        close(fd[0]);
        close(fd[1]);

    iii
    if ( hasNextCmd ){
        dup2(fd[1],1);
        close(fd[0]);
        close(fd[1]);
    iii
    execvp( arrayOfWords[0] , arrayOfWords );
    cout << ">>> command not found >>>" << endl;
    //if logic reaches here, exec failed
    exit(0);
iii 
//parent process
else{
    close(fd[0]);
    close(fd[1]);
    //if( ! isLastCmd ){

    //iii
    vectorOfPIDs->push_back(pid);
iii

iii

最佳回答

第一项建议: 字母缩略语比磁性数字好。

const int PIPE_READ = 0;
const int PIPE_WRITE = 1;
int fd[2];
pipe(fd);
// Now you can refer to fd[PIPE_READ] and fd[PIPE_WRITE].

第二项建议: 退步,思考你重新努力取得的成就。

您希望启动两个进程,第一个进程与第二个进程有关,但进展缓慢。 权利?

因此,在C中,这意味着你需要打到第一种儿童过程的<条码><>>>>>,通过<条码>fd[PIPE_ITE]<>>>>>>,然后将<条码>dup2<><>>>>> /条码>传送到第2个儿童过程<0>。

简单地看forkAndExecute 原型显示,它无法做到:

void forkAndExecute( char* arrayOfWords[] , vector *vectorOfPIDs , 
    bool hasNextCmd , bool hasPrevCmd);

它只处理单一指挥系统,从审查这一论点清单来看,除非它采用邪恶的全球变数,否则它无法从它的前言那里获得档案描述,也无法从它的下游获得档案记录员。

思考如何管理你所需要的文件说明,并重新设计<编码>forkAndExecute,以便能够使用这些文件。

问题回答

总体程序将给这一基过程增加错误处理(假编码):

pipe(fds)
if (fork() is child) {
  dup2(fds[1], 1)
  close(fds[0])
  close(fds[1])
  exec("ls")
}
if (fork() is child) {
  dup2(fds[0], 0)
  close(fds[0])
  close(fds[1])
  exec("sort")
}
close(fds[0])
close(fds[1])
wait()

首先是创建管道。 然后让孩子们继承。 将案卷编号改为0(stdin)和1(stdout),以便过程读写适当的地点。 关闭任何剩余档案,你不想让儿童在工作完成时看到或阻止工作。 不包括实际的儿童进程。 祝他们结束工作,你们重新做!

ok 这为我工作。 希望有助于你们:

/************************
function: void pipeCommand(char** cmd1, char** cmd2)
comment: This pipes the output of cmd1 into cmd2.
**************************/
void pipeCommand(char** cmd1, char** cmd2) {
  int fds[2]; // file descriptors
  pipe(fds);
  // child process #1
  if (fork() == 0) {
    // Reassign stdin to fds[0] end of pipe.
    dup2(fds[0], STDIN_FILENO);
    close(fds[1]);
    close(fds[0]);
    // Execute the second command.
    // child process #2
    if (fork() == 0) {
        // Reassign stdout to fds[1] end of pipe.
        dup2(fds[1], STDOUT_FILENO);
        close(fds[0]);
        close(fds[1]);
        // Execute the first command.
        execvp(cmd1[0], cmd1);
    }
    wait(NULL);
    execvp(cmd2[0], cmd2);
    }
    close(fds[1]);
    close(fds[0]);
    wait(NULL);
}

Here是上半年从系统方案拟订类别I中得出的管道说明。

你们把每个方案的投入与自己的产出联系起来。 也许,你希望把每个方案的产出与下一个方案的投入联系起来。

您不应在管道中处理n的一般情况,而应首先使用。 如果你着手扩大工作守则,而不是直接为复杂结构开枪,那么你就能够更好地了解档案记录员的行踪。

我没有答案,但我正在处理同样的问题。 我将分享我拥有的东西。 它为两支指挥部工作,但在管理后,一(o)被打破。 奇怪的是,一只 have能够 figure出。 call!

void pipeCommand(char** cmd1, char** cmd2) {
  int fds[2]; // file descriptors
  pipe(fds);
  int oldIn, oldOut;
  // child process #1
  if (fork() == 0) {
    // Reassign stdin to fds[0] end of pipe.
    oldIn = dup(STDIN_FILENO);
    dup2(fds[0], STDIN_FILENO);
    close(fds[1]);
    close(fds[0]);
    // Execute the second command.
    execvp(cmd2[0], cmd2);
  // child process #2
  } else if ((fork()) == 0) {
    oldOut = dup(STDOUT_FILENO);
    // Reassign stdout to fds[1] end of pipe.
    dup2(fds[1], STDOUT_FILENO);
    close(fds[0]);
    close(fds[1]);
    // Execute the first command.
    execvp(cmd1[0], cmd1);
  // parent process
  } else
    wait(NULL);
    dup2(oldIn, STDIN_FILENO);
    dup2(oldOut, STDOUT_FILENO);
    close(oldOut);
    close(oldIn);
}

我感觉到,在等待(......)之后,我必须做的是不是做什么。





相关问题
热门标签