Tag:

Linux在c中使用管道传递父进程和子进程之间的值?

进程创建子进程,将x增加1,然后将x值发送到子进程,然后子进程可以将x乘以10,然后将x传递回父进程,依此类推。 你应该至少这样做5次。 输出应如下所示: 初始值0 家长: 操作后的x值:1 儿童: 操作后的x值:10 家长: 操作后的x值:11 儿童: 操作后的x值:110 家长: 操作后的x值:111 儿童 操作后的x值:1110 我所拥有的是以下……. #include #include #include #include #define READ 0 #define WRITE 1 int main() { pid_t pid; int mypipefd[2]; int ret; int i; int x=0; int result,result2; ret = pipe(mypipefd); if(ret ==-1) //test for pipe { perror(“pipe”); //show error and […]

如何从select()的fd_set结果中仅循环活动文件描述符?

所以在我目前的服务器实现中,它目前是这样的: void loop(){ // step 1: clear set fd_set readfds; while(true){ // step 1: FD_ZERO(readfds); // step 2: loop_through_sockets_and_add_active_sockets_to(theset); // step 3: switch(select(FD_SETSIZE, &readfds, 0, 0, &tv)) { case SOCKET_ERROR: patia->receiveEvent(Error, net::getError()); return; case 0: return; } // step 4: loop through sockets and check, using FD_ISSET, which read fd’s have incoming data. } } […]

c中的pipe()和fork()

我需要创建两个子进程。 一个孩子需要运行命令“ls -al”并将其输出重定向到下一个子进程的输入,然后该进程将对其输入数据运行命令“sort -r -n -k 5”。 最后,父进程需要读取(已经排序的数据)并将其显示在终端中。 终端中的最终结果(执行程序时)应该与我直接在shell中输入以下命令相同:“ls -al | sort -r -n -k 5”。 为此,我需要使用以下方法:pipe(),fork(),execlp()。 我的程序编译,但我没有得到所需的输出到终端。 我不知道出了什么问题。 这是代码: #include #include #include #include int main() { int fd[2]; pid_t ls_pid, sort_pid; char buff[1000]; /* create the pipe */ if (pipe(fd) == -1) { fprintf(stderr, “Pipe failed”); return 1; } /* create child 2 first […]

管,叉和执行 – 父母与子女过程的双向沟通

我的操作系统类中的赋值要求我通过在同一程序上递归调用exec来构建二进制进程树。 目标是将一些任意任务拆分为单独的进程。 父母应该通过未命名的管道与孩子和父母进行交流。 我们的想法是父母将每个孩子的一半工作发送,并且这种情况会递归地继续,直到满足基本案例,其中传递给每个孩子的字符串长度<= 2.然后孩子处理这些数据并将结果发回通过管道给父母。 为了更好地理解双向通信如何与c中的管道一起工作,我在继续实际分配之前创建了以下简单程序。 父节点从不从子进程读取数据。 我期待输出…… 在父母| 收到的消息:测试 相反,当我打印时,我得到…… 在父母| 收到消息: 似乎buff是空的,而不是从子进程中读取。 有人可以解释我做错了什么和/或标准方式 写给父母的exec’d孩子 从exec’d孩子的父母那里读书 从exec’d孩子写回父母 从父母的执行孩子那里读书 我需要使用exec(),pipe(),fork()。 谢谢。 /** * ********************************* * two_way_pipes.c * ********************************* */ #include #include #include #include #include #include #include #include #define PARENT_READ read_pipe[0] #define PARENT_WRITE write_pipe[1] #define CHILD_WRITE read_pipe[1] #define CHILD_READ write_pipe[0] #define DEBUGGING 1 int main(int argc, […]

在C中制作shell时管道的正确方法是什么

我正在尝试创建自己的shell我相信我已经正确完成了分叉,但我无法弄清楚如何正确管道。 任何帮助或提示将不胜感激。 基本上我的管道不工作,我花了很多年时间试图弄清楚如何让他们在进程之间正确传输数据。 #include #include #include #include #include #include “ourhdr.h” // from Steven’s book Advanced programing in the UNIX Enviroment extern int makeargv(char *, char * , char ***); int main() { char **argp; int i,j,vpret; char buf[80]; pid_t pid; int pnum; //pipe number int ploc[16]; //pipe location //(this has a max of 12 possible […]

C管道到另一个程序的STDIN

我几乎无法理解管道的手册页,所以我需要帮助理解如何在外部可执行文件中获取管道输入。 我有2个程序: main.o和log.o 我把main.o写成了fork。 这是它正在做的事情: 父fork会将数据传递给子级 子fork将执行 log.o 我需要子fork for main来管道到log.o的 STDIN log.o只是将带有时间戳的STDIN和日志带到文件中。 我的代码是由我不记得的各种StackOverflow页面的一些代码和管道的手册页组成的: printf(“\n> “); while(fgets(input, MAXINPUTLINE, stdin)){ char buf; int fd[2], num, status; if(pipe(fd)){ perror(“Pipe broke, dood”); return 111; } switch(fork()){ case -1: perror(“Fork is sad fais”); return 111; case 0: // Child close(fd[1]); // Close unused write end while (read(fd[0], &buf, 1) […]

设置管道缓冲区大小

我有一个C ++multithreading应用程序,它使用posix管道,以便有效地执行线程间通信(所以我不必为死锁而疯狂)。 我已将写操作设置为非阻塞,因此如果缓冲区中没有足够的空间可写,则编写器将收到错误。 if((pipe(pipe_des)) == -1) throw PipeException(); int flags = fcntl(pipe_des[1], F_GETFL, 0); // set write operation non-blocking assert(flags != -1); fcntl(pipe_des[1], F_SETFL, flags | O_NONBLOCK); 现在我希望将管道缓冲区大小设置为自定义值(在特定情况下为一个单词)。 我用谷歌搜索了它,但我找不到任何有用的东西。 有办法(可能是posix兼容)吗? 谢谢 洛伦佐 PS:我在linux下(如果它可能有用)

即使在孩子终止后,Win32,来自管道块的ReadFile

我有一个简单的程序(在C中)创建两个子进程,每个等待inheritance的管道,并将输出放在一个文件中。 一切都运行良好,除了在两个管道上的一些写/读周期后,当孩子结束时,调用ReadFile块,等待管道上的数据。 我使用以下模式: … //create pipe1 CreatePipe(&hReadDup,&hWrite,&saAttr,0); DuplicateHandle(GetCurrentProcess(),hReadDup,GetCurrentProcess(),&hRead,0,FALSE,DUPLICATE_SAME_ACCESS); CloseHandle(hReadDup); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = hWrite; CreateProcess( NULL, const_cast(cmd2.c_str()), //the command to execute NULL, NULL, TRUE, 0, NULL, NULL, &si, //si. &pi ); … CloseHandle(hWrite); // EDIT: this was the operation not properly done! while(cont){ … cont = ReadFile(hRead,buf,50, &actual,NULL); … } … […]

使用pipe在父级和子级之间传递整数值

我对如何正确使用pipe()在两个进程之间传递整数值感到困惑。 在我的程序中,我首先创建一个管道,然后我把它分叉。 我假设我有“两个”管道呢? 据我所知,这是我的任务。 我的父进行for循环检查某个操作的整数值“i”,增加计数变量,并将值保存到数组中。 每次检查后,我的父母应该通过管道向我的孩子传递一个整数值“i”。 然后我的孩子使用该整数值,对值进行一些检查,并应增加计数变量,并将结果保存在[shared?]数组中。 最终, 孩子应该将它的最终计数返回给父母,父母然后打印出两个计数,以及“共享”数组。 – >我不确定我需要共享数组还是保存结果。 我可能只需要计数 – 家庭作业含糊不清,我正在等待教授的回应。 也; 我甚至可以在进程之间进行共享数组吗? 这对我来说听起来像是一个问题的开始。 – >这是我的问题:一个; 如何使用管道进行整数? 我只看过他们的角色arrays,以前的答案似乎并不认为这是可能的或合法的。? 我不确定。 没有我能找到的解决方案。 – >如何使用单向管道将整数传递给孩子? 并让孩子归还一些东西? 我不确定我怎么能……区分这两个管道。 我确实“知道”[或者我想知道]我必须关闭每个管道的一个未使用的部分,以避免“一些模糊的问题”。 抱歉愚蠢的问题; 我还没有在本课程中学过流程(除了叉子)或管道(根本没有) – 所以我不确定从哪里开始! 这是我的代码的一部分 – 它不漂亮,它不起作用,我不指望它。 它更像是一个shell占位符。 一旦我弄清楚如何使用管道 – 我可能会使代码有意义。 int main(void) { int fd[2]; pid_t childpid; pid_t parentpid; int i; int threecount = 0; int […]

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: […]