我编写此函数是为了与外部程序通信。这样的程序从stdin获取输入,并在stdout上打印其输出。为了使我的代码与这个程序通信,我使用管道将stdin和stdout重定向到缓冲区。
int query_oracle(mpz * c,int *t, mpz * m) {
int out_pipe[2];
int in_pipe[2];
int saved_stdout;
int saved_stdin;
// REDIRECT STDIN
saved_stdin = dup(STDIN_FILENO); /* save stdin for later */
我对linux很陌生,所以。我不能让我的脚本工作。我只是猜测,程序在执行tr函数时被挂起了。
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int pdesc[2];
pipe(pdesc);
int a = fork();
if (a == 0) // child
{
dup2(pdesc[1],1); // chaning std_out to pipes_out
execlp("ls", "ls
我试图在C中实现一个Linux管道链,例如:
grep file | ls | wc
因此,有一个代码将参数拆分为以管道为分隔符的标记,并将每个部分发送到下面的函数,其中包含一个整数,指定它是否位于管道之前:
int control_flow(char** args, int precedes){
int stdin_copy = dup(0);
int stdout_copy = dup(1);
// if the command and its args precedes a pipe
if (precedes){
int fd[2];
我需要模拟Linux命令"cal -3",它可以并排显示3个月的日历。我现在需要的是让我的实现,使用管道,工作。有人告诉我不能使用fork(),但我应该使用dup2()、write()、read()和close()调用system("myCustomCommand")三次。现在我的程序不能并排显示日历。
我正在尝试使用管道,但遇到了一个问题。这是我正在尝试的:
int pfd[2];
int p; //for pipe
int d; //for dup2
const int BSIZE = 256;
char buf[BSIZE];
p = pipe(pfd)
我有一个调用测试的C++代码。我正在做一个系统调用来执行这个测试。当此测试失败时,它将显示类似于“错误:无法发现以下组件类型的一个或多个设备:”
我有一个在Linux redhat上运行的C++代码,它能够检测系统调用是通过还是失败。但它无法捕获错误消息(错误:无法发现以下组件类型的一个或多个设备:)并将其附加到日志文件或打印出来。
谁能告诉我如何捕获错误消息(错误:无法发现以下组件类型的一个或多个设备:)?附言:我是一个实习生,任何帮助都会很好。
#include<iostream.h>
int main ()
{
int i;
if (system(NUL
嘿,伙计们,我正试着用C++写一个外壳程序,我在使用带有exec命令的输入文件的功能上遇到了问题。例如,Linux中的bc shell能够执行“bc<text.txt”,它以类似于批处理的方式计算文本中的行数。我正试着用我的shell做同样的事情。大致是这样的:
char* input = “input.txt”;
execlp(input, bc, …..) // I don’t really know how to call the execlp command and all the doc and search have been kind of cryptic for s
所以我有一个远程shell程序。当输出不是很大时,它工作得很好,但当我从命令中获取大量输出时,它会挂起。
下面是一段代码。我可以确认args按预期工作。例如,如果args= "ps“,args=”ps“,"-ael”,则为NULL。父进程将被挂在wait()上。孩子被execvp()卡住了。然而,如果args仅仅是"ps","-a",NULL,在输出较少的地方,它不会被阻塞在等待()上。
我应该指出的是,这是它在Mac上编辑的内容。在Linux系统上会崩溃,并显示free():invalid next size (normal)。
...
if
这里有一些C样板,用于生成linux上的终端程序并与其通信(可能还有其他unixes)。
int master, slave;
struct winsize wsize = {24, 80, 0, 0}; // 24 rows and 80 columns
if (openpty(&master, &slave, NULL, NULL, &wsize) < 0)
die("Failed to open the pty master/slave");
if (!fork()) {
// child, set session id and
在一本关于C编程的德文书(Linux Programmierung,由Jürgen Wolf编写)中,我找到了一份声明,翻译成英文如下(句子由我编号):
在某些情况下,您可能需要复制文件描述符1。例如,如果父进程想要与子进程交换数据,并且子进程通过使用exec*() 2被新进程覆盖。在这种情况下,如果没有dup() or dup2(),则设置关闭-exec标志3。当设置此标志时,所有文件描述符都无效(因为被新进程覆盖)--即,它们不再存在。父进程和子进程之间的通信将因此停止5。另一方面,如果您使用dup() or dup2()复制文件描述符,那么关闭-exec标志将被删除,新覆盖的进程可以使
我需要在Linux下使用C语言模拟下面的bash命令(使用fork、exec、kill、signal、wait、waitpid、dup2、open、sleep、管道等)。
[0] echo 'tail-f $1' > /tmp/rtail
[1]/tmp/rtail ~/.bash_history >> /tmp/1.txt &
PID of process [1] should be saved.
[2] Expect termination of the command started on step [1]. After termination