Tag: pipe

通过C中的argv使用管道发送和接收字符数组

所以,我正在尝试创建一个管道,通过argv []连接的管道来回发送char数组。 现在,我一直坚持在接口中接收数组(从父节点发送到子节点的c_param的参数)。在db.c中接收字符3和5。 我知道3和5是我的管道所在的argv []的索引,但我不知道如何接受它并在db.c中打印出我的消息。 interface.c创建管道,分叉到父进程和子进程。 char数组param被转移到子进程到char数组c_param。 使用snprintf,我将我的管道变成了一个char,使用execl和我的char数组c_param发送。 interface.c: int main (int argc, char *argv[]) { int to_Child[2]; int to_Parent[2]; int id, toChildPipe, toParentPipe, err; char param[100] = “This is the parameter!”; char sendPipe[100]; char recPipe[100]; /*CREATING PIPE*/ toChildPipe = pipe(to_Child); toParentPipe = pipe(to_Parent); if(toChildPipe == -1 || toParentPipe == -1) { printf (“Error on […]

写入Fortran和C程序之间的管道时出现问题

我有一个由其他人用Fortran编写的程序,因此从标准输入中读取一些内容然后进行一些计算并输出结果。 我想要做的是使用来自另一个程序的不同输入数据多次运行它,由我用C语言编写。 要做到这一点,我使用popen : FILE *pipe = popen(“.\\program.exe”, “wt”); if (!pipe) { exit(1); } fprintf(pipe, “%d\n”, thing1); fprintf(pipe, “%d\n”, thing2); … pclose(pipe); 问题是它不能以这种方式工作。 它与“program.exe <input.txt”完美配合,但不是这种方式。 它读取第一件事然后输出这个愚蠢的错误:“IO-09系统文件错误 – 未知错误”。 当然我不知道这意味着什么,因为我从未编写过Fortran。 我究竟做错了什么? 编辑: 不幸的是,我没有该程序的源代码

在C中多次从stdin读取相同的数据

我正在C中编写一个基于跟踪文件的缓存模拟器,我想通过stdin将其导入程序。 这些跟踪文件最长可达150亿行,因此我不希望将它们存储在活动内存中的任何位置。 我想使用在程序输入中指定的配置文件,从一次调用中为不同的内存配置多次运行模拟。 程序调用应如下所示: cat | (trace file) ./MemorySimulator -f (config file) 现在,程序运行的方式是它使用配置文件来设置模拟的参数,然后使用scanf()从stdin读取格式化数据中的管道,直到它到达跟踪文件的末尾。 然后,它从配置文件进入下一个配置设置,并尝试再次从跟踪文件中读取数据。 此过程将继续,直到各种配置选项用尽为止。 我遇到的问题是,一旦我运行跟踪文件一次,我就无法再从配置文件中为以下内存配置捕获数据。 有没有办法在我的C程序中回收管道数据,以便我可以从单个程序执行多次运行模拟? 到目前为止,我还没有找到实现这一目标的方法。

将孩子的stdout传递给父母stdin

我尝试将子进程中的程序的stdout传递给父进程中的stdin。 在bash中,这将是这样的: wget“adress”|少 我的代码如下所示: int fd[2]; pid_t child_id; int status; char *args[] = {“wget”,”-O -“,argv[1], NULL}; int pipe(int fd[2]); child_id = fork(); if (child_id == -1) { printf (“Fork error\n”); } if (child_id == 0) { close(fd[0]); int c = dup2(fd[1],1); execl (“/usr/bin/wget”, “wget”, “-qO-“,argv[1], NULL); } else{ waitpid(child_id,&status,0); close(fd[1]); int c2 = dup2(fd[0],STDIN_FILENO); printf(“%i\n”,c2 […]

用C中的popen捕获tshark标准输出

我试图通过C中的程序从tshark捕获标准输出。为此,我使用popen()调用打开tshark进程并从返回的FILE流中读取。 代码示例: #include #include int main() { FILE* pipe_fd = popen(“tshark -i eth0 -R icmp -2 -T fields -e icmp.checksum -e icmp.seq”, “r”); //FILE* pipe_fd = popen(“lsof”, “r”); if (!pipe_fd) { fprintf(stderr, “popen failed.\n”); return EXIT_FAILURE; } char buffer[2048]; while (NULL != fgets(buffer, sizeof(buffer), pipe_fd)) { fprintf(stdout, “SO: %s”, buffer); } pclose(pipe_fd); printf(“tdr FINISHED!\n”); return […]

将多个文件(gz)传送到C程序中

我编写了一个C程序,当我使用stdin将数据传输到我的程序时,它可以工作: gunzip -c IN.gz|./a.out 如果我想在文件列表上运行我的程序,我可以这样做: for i `cat list.txt` do gunzip -c $i |./a.out done 但这将启动我的程序’文件数’次。 我有兴趣将所有文件传递到同一个进程中。 喜欢做 for i `cat list.txt` do gunzip -c $i >>tmp done cat tmp |./a.out 我怎样才能做到这一点?

子程序不会在C程序中死亡

我正在编写一个C程序,它将STDIN中的输入解析为单词,生成由numsorts变量指定的多个排序进程,以循环方式将单词排序到每个排序进程,并发送排序的输出到STDOUT。 如果指定的排序进程的数量为1,我的程序将按照需要工作并干净地退出,但如果排序进程的数量大于1,则排序子进程不会死,并且我的程序会等待它们。 对我来说,最奇怪的部分是,如果我打开一个单独的终端窗口并杀死除1以外的所有孩子,最后一个孩子会立即自行死亡并且程序干净利落。 这是我的解析器代码(管道文件描述符存储在一个二维数组中): void RRParser(int numsorts, int **outPipe){ //Round Robin parser int i; char word[MAX_WORD_LEN]; //Close read end of pipes for(i = 0; i < numsorts; i++){ closePipe(outPipe[i][0]); } //fdopen() all output pipes FILE *outputs[numsorts]; for(i=0; i < numsorts; i++){ outputs[i] = fdopen(outPipe[i][1], "w"); if(outputs[i] == NULL) printf("Error: could not create output stream.\n"); } […]

Select()仍然阻止从管道读取

我的应用程序分叉一个孩子,孩子执行一个新的程序,父母写入它,然后在孩子完成一些工作后从孩子读回来。 当监视管道的读取结束时,程序仍然等待孩子。 我目前没有写回父母,所以它故意阻止。 下面是代码(write_to()函数关闭函数中管道的未使用部分): pid_t leaf_proc; int rv = 0; int w_pfd[2]; int r_pfd[2]; if(pipe(w_pfd) == -1 || pipe(r_pfd) == -1){ printf(“Failed to pipe. Goodbye.\n”); exit(0); } if((leaf_proc = fork()) < 0){ printf("Error: %s\n",strerror(errno)); exit(0); }else if(leaf_proc == 0){ /***Child to be execl()'d***/ rv = execl("Some program"); if(rv < 0){ printf("Error: %s\n",strerror(errno)); exit(0); } }else{ […]

管道和工艺管理

我正在研究用C实现的一个小shell(tsh)(它是一个赋值)。 任务的一部分属于PIPING。 我必须将命令的输出传递给另一个命令。 例如: ls -l | sort ls -l | sort 当我运行shell时,我在其上执行的每个命令都由它生成的子进程处理。 孩子完成后,返回结果。 对于管道我想首先实现一个带编码的示例来检查它是如何工作的。 我写了一个部分有效的方法。 问题是当我运行管道命令时,在子进程完成后,整个程序退出它! 显然我没有正确处理子进程信号(下面的方法代码)。 我的问题: 如何使用pipe()进行流程管理? 如果我运行命令ls -l | sort ls -l | sort是否为ls -l和另一个进程sort创建子进程? 从我到目前为止看到的管道示例中,只创建了一个进程(fork())。 当处理第二个命令(从我们的示例中sort )时,我如何获得其进程ID? 编辑:同时运行此代码我得到两次结果。 不知道为什么它会运行两次,那里没有循环。 这是我的代码: pid_t pipeIt(void){ pid_t pid; int pipefd[2]; if(pipe(pipefd)){ unix_error(“pipe”); return -1; } if((pid = fork()) <0){ unix_error("fork"); return -1; } if(pid […]

如何检查我的程序是否有数据传输到其中

我正在编写一个应该通过stdin读取输入的程序,所以我有以下结构。 FILE *fp=stdin; 但是如果用户没有将任何东西输入到程序中,这只会挂起,我如何检查用户是否实际将数据传输到我的程序中 gunzip -c file.gz |./a.out #should work ./a.out #should exit program with nice msg. 谢谢