pipe 相关问题

Unix管道连接两个进程的文件描述符。使用在<unistd.h>中声明的POSIX pipe()函数创建管道。 Shell使用“|”在进程之间提供管道创建。也可以使用CreatePipe()在Windows上创建管道。这个概念可用于将标准输入,标准输出和标准错误可移植地重定向到.net和Java语言中的调用过程。

fork()和pipe()

我需要此示例应用程序的帮助。当我运行它时,它在子进程打印“Child Sending!”后卡住了。 #包括 #包括 #包括 我需要此示例应用程序的帮助。当我运行它时,它在子进程打印“Child Sending!”后卡住了。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #define INPUT 0 #define OUTPUT 1 int main() { int fd1[2]; int fd2[2]; int pid; if (pipe(fd1) < 0) exit(1); if (pipe(fd2) < 0) exit(1); if ((pid = fork()) < 0) { perror("fork"); exit(1); } else if (pid == 0) { close(fd1[INPUT]); close(fd2[OUTPUT]); char *str = "Hello World!"; printf("Child sending!\n"); write(fd1[OUTPUT], str, strlen(str)); char *bufferc = (char *)malloc(1000); char *readbufferc = (char *)malloc(80); int rdc; int gotdata = 0; while (gotdata == 0) while ((rdc = read(fd2[INPUT], readbufferc, sizeof(readbufferc))) > 0) { strncat(bufferc,readbufferc,rdc); gotdata = 1; } printf("Child received: %s",bufferc); free(readbufferc); free(bufferc); exit(0); } else { close(fd1[OUTPUT]); close(fd2[INPUT]); int rd; char *buffer = (char *)malloc(1000); char *readbuffer = (char *)malloc(80); int gd = 0; while (gd == 0) while ((rd = read(fd1[INPUT],readbuffer, sizeof(readbuffer))) > 0) { strncat(buffer, readbuffer,rd); gd = 1; } printf("Parent received: %s\n",buffer); free(readbuffer); printf("Parent sending!"); write(fd2[OUTPUT], buffer, strlen(buffer)); free(buffer); } return 0; } 顺便说一句,当我使用fork时,有没有办法进行调试,因为GDB会自动转到父进程? 子进程向父进程写入数据后,必须关闭管道的写入端,以便父进程知道它已达到 EOF。 您的代码中有很多错误。为什么使用 fd2 而不初始化它?去掉它。 现在它陷入了“子发送”状态,因为管道读取是一个阻塞调用,并且您将其放入一个永远不会返回的 while 循环中。请参阅管道的手册页。 如果您想中断 while 循环,请关闭该管道的所有写入端。 还要调试子进程,请在调试时调用 fork() 之前使用 gdb 命令 follow-fork-mode 作为子进程。 有几处错误: fd2 只是从未初始化过。 家长永远不会退出这个: while ((rd = read(fd1[INPUT],readbuffer, sizeof(readbuffer))) > 0) { strncat(buffer, readbuffer,rd); gd = 1; } 如果没有数据要读取,read将会阻塞并且不返回。唯一让它退出的是连接被关闭并且子进程没有关闭它。 您调用 read() 的期望是,如果没有任何内容可读取,它将返回读取的零字节。然而,您所看到的是因为 read() 在返回之前正在等待一些数据。要解决此问题,您需要执行以下两件事之一: 将套接字设置为执行非阻塞读取(不推荐) 读取之前先用select()或poll()查看是否有数据需要读取 还有其他几点: 不要投射 malloc() 的回报 检查 malloc() 是否不返回 NULL 将整个 gotdata 内容替换为 break 指令

回答 4 投票 0

如何从 Java 应用程序使用命令提示符命令

我正在尝试创建一个使用特定命令运行CMD的java程序 目录 C:\windows | java -jar C:\Column.jar 3 当我手动运行它时,但我无法从java运行它。 我有...

回答 1 投票 0

在cpp中执行python文件

我想在cpp中执行一个python文件,使其成为一个可以与我的其他子进程通信的进程。但是当我使用 execl("python3", "python3", "python/a1.py"...

回答 1 投票 0

Linux/C:添加 waitpid 后,带有子进程的进程都挂起

考虑下面的代码,它的作用是: 分叉一个孩子,创建一个管道。子进程会将标准输入重定向到管道,然后从标准输入(也称为从管道)读取。 ...

回答 1 投票 0

如何在对象的整个生命周期中保持指针字段不变(C++ 中管道的句柄)

我正在尝试创建一个处理程序类来处理 C++ 中的管道。首先我可能会说我已经习惯了 C#,但对 C++ 和指针的概念还很陌生。 类中唯一的字段是变量...

回答 1 投票 0

UNIX 中管道机制如何工作

我想确认一下我对 UNIX 命令执行中的管道的理解。 当我们在一系列命令中使用管道时,前面命令的输出将作为输入传递给后面的命令...

回答 1 投票 0

如何通过 C 中的管道发送错误?

我有一个多线程C程序,我创建了一个管道来在线程之间发送数据。我有一个线程生成数据并将其写入管道,然后另一个线程从...读取数据

回答 1 投票 0

`moment` 库与角度`Pipe` 在处理日期格式方面

我正在使用矩库和角管来处理日期对象(格式)。 我发现的问题是日期格式字符串的解释不同。 我有java脚本日期o...

回答 1 投票 0

C 上的石头、剪刀、布,使用 fork() 和 pipe()

我有一个课堂练习,这是练习: 练习 2. 用 C++ 编写一个名为“Game”的类,该类执行以下操作: 创建一个子进程负责随机返回“...

回答 1 投票 0

Kubernetes:如何使用具有管道的 Exec 编写 livenessprobe 和 readinessprobe

我正在使用 Exec 探针添加活性探针和就绪探针。 我的配置如下: 准备情况探针: 执行: 命令:“/usr/bin/jps -l | grep QueueProcess” 时期第二...

回答 1 投票 0

如何将 Postgresql“psql”错误传递给 grep?

我正在运行一个 psql 查询,如下所示: $ psql --file=foo.sql "BAR-DB" 其中 foo.sql 包含查询。 foo.sql 的语法错误,因此输出是错误消息列表。我的计划是通过管道输出...

回答 1 投票 0

重定向到日志文件时如何在 stdout 和 stderr 输出前添加时间戳?

在 Linux 中,我在 init 脚本 (SysVInit) 中启动一个名为 $cmd 的程序。我已经将 $cmd 的 stdout 和 stderr 重定向到两个不同的日志文件,称为 $stdout_log 和 $stderr_log。现在我也...

回答 4 投票 0

如何等待流完成管道传输? (Nodejs)

我有一个 for 循环的 Promise 数组,所以我使用 Promise.all 来遍历它们,然后调用 then 。 让承诺= []; Promise.push(promise1); Promise.push(promise2); Promise.push(承诺...

回答 5 投票 0

您可以通过 PowerShell 从 Python 脚本传输非文本数据吗?

我对 bash 相当熟悉,并且知道如何使用一些涉及管道的基本脚本编写内容,并将它们用作“后端”来按顺序运行 python 脚本。 然而,对于一个新项目,我的任务是......

回答 1 投票 0

测试 stdin 是否有 C++ 输入(Windows 和/或 Linux)

我基本上想测试标准输入是否有输入(就像你回显并通过管道传输它一样)。我找到了可行的解决方案,但它们很丑陋,而且我喜欢干净的解决方案。 在linux上我用这个: 布尔标准...

回答 5 投票 0

使用管道而不提供第一个参数

%>% 管道运算符是否始终将左侧 (LHS) 提供给右侧 (RHS) 的第一个参数?即使在 RHS 调用中再次指定第一个参数? 说我想要

回答 3 投票 0

Linux下AT命令重定向到microcom命令

Linux 的 BusyBox 命令中存在与串行调制解调器通信的 microcom 命令: BusyBox v1.13.2 (2012-05-10 17:13:08 CEST) 多调用二进制文件 用法:microcom [-d DELAY] [-t TIMEOU...

回答 3 投票 0

R:跨列指定级别的数字因子

我有一项调查数据,其中在三个时间点取得了李克特分数。目前采用数字形式,我想将所有包含 Likert 分数数据的列从数字转换为具有指定

回答 1 投票 0

c++ write()/read() 缓冲区类型不起作用

我正在 Visual Studio Code 中使用 C++ 中的叉子和管道编写一个项目,当我编写代码时 int 临时性; 写(fds[1],temptotal,sizeof(int)); 或者 读取(fds [0],temptotal,sizeof(int)); 我明白了...

回答 1 投票 0

即使添加了 #include <stdio.h>,popen 仍隐式声明

这是我的代码的一小段。 #包括 #包括 #包括 #包括 #包括 #包括 这是我的代码的一小段。 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/types.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> ... FILE * pipe; ... pipe = popen ("ls /tmp -1", "r"); ... pclose(pipe); blarg.c:106: warning: implicit declaration of function ‘popen’ blarg.c:106: warning: assignment makes pointer from integer without a cast blarg.c:112: warning: implicit declaration of function ‘pclose’ blarg.c:118: warning: assignment makes pointer from integer without a cast 我真的不确定。我查了一下popen,它所需要的只是提供的stdio.h。缺少什么,或者是我的代码的其余部分有问题(我真的不想显示更多代码,因为它是一个作业)。 将 -std=c99 或 -std=c11 等替换为 -std=gnu99 或 -std=gnu11。 正如手册页所说: Feature Test Macro Requirements for glibc (see feature_test_macros(7)): popen(), pclose(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE 所以你应该在#define _BSD_SOURCEing #include之前stdio.h或其他之一。 我在MinGW中遇到了这个问题;在它的 stdio.h 中我发现: #ifndef NO_OLDNAMES _CRTIMP __cdecl __MINGW_NOTHROW FILE * popen (const char *, const char *); _CRTIMP __cdecl __MINGW_NOTHROW int pclose (FILE *); #endif 事实证明,我的 gcc 命令行上有 -DNO_OLDNAMES=1 来修复另一个我什至不记得的另一个源文件中的一些模糊问题。这是我的简单修复: #ifdef NO_OLDNAMES #undef NO_OLDNAMES #endif #include <stdio.h> 正如@Conrad Mayer 等其他人评论的那样。 简洁,只需添加 #define _POSIX_C_SOURCE 200809L // Define this before any includes #include <stdlib.h> ... rest of code ... 解释 popen() 函数是 POSIX 标准的一部分,其声明可能取决于正确定义的功能测试宏。这应该确保 popen() 的必要声明可用。 如果问题仍然存在,您可以尝试在包含标头之前定义 _GNU_SOURCE,因为 popen() 也是 GNU 扩展: #define _GNU_SOURCE #include <stdlib.h> ... 我将 popen 和 pclose 的原型放在代码的顶部。看来问题已经解决了。

回答 5 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.