Tag:

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的fork()

#include int num = 0; int main(int argc, char*argv[]){ int pid; pid = fork(); printf(“%d”, num); if(pid == 0){ /*child*/ num = 1; }else if(pid > 0){ /*parent*/ num = 2; } printf(“%d”, num); } 我无法理解为什么可能的输出是0102或0012或0201或0021。 这是我认为它应该产生的东西。 它命中第一个printf语句,无论先执行什么子项或父项,num都没有被修改,所以首先是0。 然后接下来是1或2,然后执行下一个过程,所以再次从0开始(从父模块复制),然后再次从1或2开始。 所以可能的输出应该是: 0101或0102或0201或0202

儿童父母关系与inheritance

我对C全新。 使用fork();创建的子进程中inheritance的进程项是什么fork(); ? 与流程的父级不同的流程项有哪些?

fork(应该是)在线程程序中对信号处理程序是否安全?

我真的不确定POSIX在存在线程和信号时对fork的安全性的要求。 fork被列为异步信号安全函数之一,但是如果库代码有可能注册了非异步信号安全的pthread_atfork处理程序,这会否定fork的安全性吗? 答案取决于运行信号处理程序的线程是否正在使用atfork处理程序所需的资源? 或者换句话说,如果atfork处理程序使用同步资源(互斥体等),但是从一个永远不会访问这些资源的线程中执行的信号处理程序调用fork ,程序是否符合要求? 在这个问题的基础上,如果使用pthread_atfork建议的习语在系统库内部实现“线程安全”分叉(获取prefork处理程序中的所有锁并释放父和子postfork处理程序中的所有锁),那么就是fork在线程程序中使用信号处理程序是否安全? 处理信号的线程是否可能在调用malloc或fopen / fclose并持有全局锁的过程中,导致fork期间出现死锁? 最后,即使fork在信号处理程序中是安全的,在信号处理程序中fork然后从信号处理程序返回是安全的,或者在信号处理程序中调用fork总是需要后续调用_exit或其中一个exec信号处理程序返回之前的函数族?

fork如何与逻辑运算符一起工作

main() { if (fork() || (fork() && fork())) printf(“AA\n”); else if (!fork()) printf(“BB\n”); else printf(“CC\n”); } 我运行了以下代码并获得AA AA CC BB CC BB的结果。 虽然我理解fork如何工作,但我不明白它对逻辑运算符的作用。 我们class上的老师希望我们为这个作业给出答案。 虽然我可以轻松运行此程序,但我想知道究竟发生了什么。 任何人都可以向网站解释或指导我使用带逻辑运算符的fork时会发生什么。 我对c / c ++很陌生,所以对我很轻松。 谢谢

用fork()太多的孩子

代码 : for ( ii = 0; ii < 24; ++ii) { switch (fork()) { case -1 : { printf("\n\nproblem with fork() !!! \n\n"); exit(0); }; case 0 : { WriteOnShared_Mem(ii); }break; default : { ChildPidTab[ii] = p; usleep(50000); ReadShared_MemMp(nbSect, 24,ChildPidTab); }; } } 我的问题是,我得到太多的孩子(nbenfant = 24),我得到的超过24岁:/ 这是我今天在这里的第3篇post,但仍未解决:( 谢谢

在if语句/管理进程中使用fork

我有这段代码: printf(“L1 “); if(fork() != 0) { printf(“L2 “); if(fork() != 0) { printf(“L3 “); fork(); } } printf(“End \n”); 作为练习,我试图找出运行此代码(无需实际运行)导致的有效/无效输出的一些示例。 我仍然对fork()方法在if语句中的工作方式有点困惑。 我知道一旦它被调用它会返回两次,表明它已经创建了两个进程。所以,如果我做了类似的事情, printf(“L1 “); fork(); printf(“L2 “); 我会得到L1 L2 L2 但是我仍然不知道如何在第一段代码中的语句中工作。 以下是我认为的一些有效/无效输出: Valid: L1 L1 L2 L1 L2 L3 L1 L2 L1 Invalid: (Anything hat doesn’t start with L1) L1 L2 L2 L1 L3 […]

C fork调用中的奇怪输出

我有以下C代码。 #include #include #include int main () { int i=1; pid_t child_pid = fork(); if (child_pid == 0) { printf (“%d\n”, i++); printf (“%d\n”, i++); printf (“This is child process.”); return 0; } else if (child_pid > 0) { printf (“%d\n”, i++); printf (“This is parent process.”); } else { printf(“Fork failed”); } } 我按如下方式编译了以下内容: […]

C – 并行执行fork()时等待(NULL)的含义

在下面的代码中,forks实际上是并行运行还是一个接一个地运行? wait(NULL)是什么意思? (该程序创建n个子进程,n通过命令行提供) int main ( int argc, char *argv[] ) { int i, pid; for(i = 0; i < atoi(argv[1]); i++) { pid = fork(); if(pid < 0) { printf("Error occured"); exit(1); } else if (pid == 0) { printf("Child (%d): %d\n", i + 1, getpid()); exit(0); } else { wait(NULL); } } }