Tag: dup2

使用execvp在输出重定向期间接收错误代码

我试图将输出从ls重定向到我在C中创建的shell中的文件。我输入: ls > junk 我得到的是: ls: cannot access >: No such file or directory 然后,如果我使用CTRL-D退出shell,它会在退出之前将ls命令的结果打印到屏幕。 我尝试使用print语句来确定它发生的位置,并且在以下情况之后不打印任何打印语句: dup2(f, STDOUT_FILENO); Also tried dup2(f, 1); 码: pid = fork(); if(pid == 0) { // Get the arguments for execvp into a null terminated array for(i = 0; i “) == 0) //numargs is the number of arguments typed […]

有人可以解释C中的dup()吗?

我知道dup,dup2,dup3“ 创建文件描述符oldfd的副本 ”(来自手册页)。 但是我无法消化它。 据我所知,文件描述符只是用于跟踪文件位置及其方向(输入/输出)的数字。 是不是更容易 fd=fd2; 每当我们想要复制文件描述符? 还有别的…… dup()使用编号最小的未使用描述符作为新描述符。 这是否意味着它还可以作为值stdin , stdout或stderr,如果我们假设我们有close() –其中一个?

C中的这个多管道代码是否有意义?

几天我就提出了一个问题 。 我的解决方案符合接受的答案中的建议。 但是,我的一个朋友提出了以下解决方案: 请注意,代码已更新几次(查看编辑修订版)以反映下面答案中的建议。 如果您打算给出新的答案,请考虑这个新代码,而不是那些有很多问题的旧代码。 #include #include #include #include int main(int argc, char *argv[]){ int fd[2], i, aux, std0, std1; do { std0 = dup(0); // backup stdin std1 = dup(1); // backup stdout // let’s pretend I’m reading commands here in a shell prompt READ_COMMAND_FROM_PROMPT(); for(i=1; i 1) { dup2(aux, 0); close(aux); } […]

在C中遇到fork(),pipe(),dup2()和exec()时遇到问题

这是我的代码: #include #include #include #include #include #define NUMPIPES 2 int main(int argc, char *argv[]) { char *bBuffer, *sPtr, *aPtr = NULL, *pipeComms[NUMPIPES], *cmdArgs[10]; int fdPipe[2], pCount, aCount, i, status, lPids[NUMPIPES]; pid_t pid; pipe(fdPipe); while(1) { bBuffer = readline(“Shell> “); if(!strcasecmp(bBuffer, “exit”)) { return 0; } sPtr = bBuffer; pCount = -1; do { aPtr = […]

popen()可以像pipe()+ fork()那样制作双向管道吗?

我正在用C ++(主要是C)在模拟文件系统上实现管道。 它需要在主机shell中运行命令,但在模拟文件系统上执行管道本身。 我可以通过pipe() , fork()和system()系统调用实现这一点,但我更喜欢使用popen() (它处理创建管道,分叉进程,并将命令传递给shell) 。 这可能是不可能的,因为(我认为)我需要能够从管道的父进程写入,在子进程端读取,从子进程写回输出,最后从父进程读取该输出。 我的系统上popen()的手册页说可以使用双向管道,但是我的代码需要在一个只支持单向管道的旧版本的系统上运行。 通过上面的单独调用,我可以打开/关闭管道来实现这一目标。 这可能与popen() ? 对于一个简单的例子,运行ls -l | grep .txt | grep cmds ls -l | grep .txt | grep cmds ls -l | grep .txt | grep cmds我需要: 打开一个管道和进程以在主机上运行ls -l ; 读回它的输出 将ls -l的输出传回我的模拟器 打开一个管道和进程,在ls -l的管道输出上的主机上运行grep .txt 将此输出传回模拟器(卡在此处) 打开一个管道和进程,在grep .txt的管道输出上的主机上运行grep cmds 将其输出传回模拟器并打印出来 男人popen 从Mac OS X: […]