即时通讯目前正在实施一个壳在C.我的问题出现,当我尝试运行一个像这样的命令:
SHELL$: sort < txtFile | grep key
即时通讯运行sort < txtFile在一个进程(子),并在父母,即else if(pid > 0)即时通讯pipe道的右侧运行其他命令。
程序运行正常,但它退出我主要设置的无限循环,以不断接收来自用户的input。
我怎么能解决这个问题?
linux fork:防止文件描述符inheritance
分叉系统调用的应用程序
在fork for循环之后计数进程
如何产生不会与父母一起死亡的儿童stream程?
fork()系统调用c
这是我到目前为止处理pipe道的代码,我没有包含我必须处理redirect的代码:
c2p是我为此设置的pipe道。
if(pid == 0) { if( PIPE_FLAG ) { close(c2p[0]); if(dup2(c2p[1],STDOUT_FILENO) == -1){ perror("dup2() Failed"); exit(2); } } /* Execute command */ execvp(cmd_args[0],cmd_args); perror("exec Failed 1. "); /* return only when exec fails */ exit(-1); } else if(pid > 0) { if(PIPE_FLAG) { close(c2p[1]); if(dup2(c2p[0],STDIN_FILENO) == -1){ perror("dup2() Failed"); exit(-1); } execvp(nxt_args[0],nxt_args); perror("exec Failed 2. "); exit(-1); } } else { /* error occurred */ perror("fork Failed"); exit(1); }
用Ruby 1.8和Windows分叉
在困境内分叉
我如何在Windows中启动subprocess?
为什么我的编译器不接受fork(),尽pipe包含了<unistd.h>?
我在子进程中运行sort < txtFile ,在父进程中,我正在管道右侧运行命令。
那么你的shell进程会发生什么? 父进程是shell。 通过在父进程中运行右侧命令,您可以接管shell进程。 请记住,exec()取代了当前的进程。
您需要fork()两次,并在子进程中执行管道的两端。 父节点必须保持为shell,然后在呈现下一个命令提示符之前等待()子节点退出。
/* How shell works */ #include<stdio.h> #include<unistd.h> main (int argc,char **argv) { if (argc < 2) { fprintf (stderr,"nUsage: ./a.out cmd [options]...n"); } if (!fork ()) { argv++; execvp (argv[0],argv); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。