Tag: 管道

C程序对三个命令执行管道

我必须编写一个程序来执行与du |相同的操作 排序| 在命令行的头会做,但我卡住了,我的程序不工作。 现在的输出是112。 并且该程序不会终止。 请帮忙,我不知道该怎么办! int main(void) { int fd[2]; int fd1[2]; int pid; if (pipe(fd) == -1) { perror(“Pipe”); exit(1); } switch (fork()) { case -1: perror(“Fork”); exit(2); case 0: dup2(fd[1], STDOUT_FILENO); close(fd[0]); close(fd[1]); execl(“/usr/bin/du”, “du”, (char *) 0); exit(3); } if (pipe(fd1) == -1) { perror(“Pipe”); exit(1); } switch (fork()) { […]

在Linux中无法阻止从命名管道(FIFO)读取

我似乎无法完成这项工作,这很奇怪。 这是我的架构:我有一个命名管道,它将在一个始终运行的 root读取器进程和多个应用程序编写器进程之间进行通信。 当编写器nonblocking blocking时,读取器进程必须被blocking 。 因此,这是我在读者进程中所做的,它将以root权限运行。 reader.c #define PIPE_ID “/dev/shm/mypipe” // This function configures named pipe void configure_pipe() { // So that others can write umask(0000); if(mkfifo(PIPE_ID, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH | S_IWGRP | S_IWOTH) != 0) { perror(“mkfifo error\n”); } } 在主要function: int main (int argc, char **argv) { int […]

如何使用fprintf并写入管道?

我创建了一个管道,并使用dup2()将流1和2(stdout和stderr)覆盖到这些管道中。 现在我希望使用fprintf写入流1或2,但我的程序似乎没有在管道的另一端接收任何东西。 我已经尝试过使用printf(),但我不确定这是默认写入stdout还是流1。 如果它写入流1,我想它在我的代码更深处的问题。 基本上我问,给定一个表示流的int,我如何得到一个适合在fprintf()中使用的FILE *?

即使添加了#include ,也会隐式声明popen

这是我的代码的一小部分。 #include #include #include #include #include #include #include #include #include #include #include #include … 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 […]

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

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

声明char数组会导致execv()无效

我编写了以下代码,以便在c unix中使用管道: #include #include #include #include #include int main () { int fds[2]; pid_t pid; /* Create a pipe. File descriptors for the two ends of the pipe are placed in fds. */ pipe (fds); /* Fork a child process. */ pid = fork (); if (pid == (pid_t) 0) { //char abc[10]; – **Uncommenting […]

使用管道将文件i / o引导到另一个进程

刚开始学习/使用管道,并想知道如何将应用程序的文件输出路由到管道,以便其他应用程序可以使用它。 确切地说,我想将ffmpeg的输出(转码后的video数据)传输到我的应用程序中以使用它。 如果我创建一个像/tmp/out.mp4这样的命名管道并将其作为输出文件名提供给ffmpeg,ffmpeg将尝试再次创建此文件,可能会覆盖我的管道(或类似的东西)。 如何应对这种情况? 是否有任何通用的方法可以透明地转移应用程序的文件IO? (我正在尝试编写一个video流服务器(仅供学习和娱乐),它将像avi这样的格式转换为流式友好格式,如mpeg4,在流媒体中,我发现ffmpeg对于此目的来说太慢了,它需要2秒才能转码1秒video:( 这是我的设置/ PC或ffmpeg的问题是否缓慢? ) PS:顺便说一下,我在C中写这个。

从管道命令中读取文件名

所以我试图让C程序从命令行读取文件名,格式如下:cat(filename path)| (程序名称) 当输入文件作为命令行参数输入时,我可以让它读取输入文件的名称,但它不会从连接的参数中读取 这是代码,现在它读取文件的名称,就像在命令行上写入程序名称一样。 #include #include //initialize file pointer FILE *file; //initialize global variables #define DEFAULT_LEN 70 //main int main(int argv, char *argc[]){ //open File for reading file = fopen (argc[1],”r”); //test for failure of file open, if failed, print message, quit if(file == NULL){ printf(“I’m sorry Dave, I’m araid I can’t do that.\n”); […]

制作Linux shell时流重定向和管道

我有一个在C中创建Linux shell的任务。目前,我仍然坚持实现重定向和管道。 我到目前为止的代码如下。 main()解析用户的输入。 如果内置命令,则执行该命令。 否则,标记化的输入传递给execute()(我知道我应该将内置命令拉入它们自己的函数中)。 execute()的作用是遍历数组。 如果遇到< , >或| 它应该采取适当的行动。 我试图正常工作的第一件事是管道。 不过,我肯定做错了,因为即使是一个烟斗也无法让它工作。 例如,输入/输出示例: /home/ad/Documents> ls -l | grep sh |: sh: No such file or directory | 我的想法是让每个方向和管道只适用于一个案例,然后通过使函数递归,我希望在同一命令行中使用多个重定向/管道。 例如,我可以执行program1 output1.txt或ls -l | grep sh > output2.txt ls -l | grep sh > output2.txt 。 我希望有人可以在试图管道时指出我的错误,并且可能提供一些关于如何处理用户输入多个重定向/管道的情况的指示。 #include #include #include #include #include int MAX_PATH_LENGTH = 1024; […]

使用信号和sigpipe

我正在进行一项任务,包括使用fork(进程),信号和选择编写程序来处理数据(计算pi)。 我现在正在处理信号,我想我想做的是使用SIGPIPE,所以如果程序捕获它,它会再次尝试写入管道(如果进程试图写入没有读取器的管道,它将被发送SIGPIPE)。 我在main()中使用fork()通过将每个进程发送到worker函数来为它们分配相同的工作。 void worker(int id) { …. (this piece of code is not relevant) if(write(pfd[id][1], &c, sizeof(c)) == -1) printf(“Error occurred: %s\n”,strerror(errno)); } 如何在此函数中实现信号以捕获SIGPIPE并使其再次写入管道? 谢谢!