Articles of 分叉

当使用信号捕捉叉时程序变得无限

嗨,每一个,而做一些实验使用叉子和信号,我遇到了一个程序,显示非常有趣的行为,但经过数小时的努力,我无法弄清楚发生了什么事情。 我想要做的是我在主体内创build一个subprocess,然后打印“你好世界”,然后调用退出。 在这之后,我们完全明白它的信号处理程序会被调用,并且等待系统调用阻塞的父进程也会被调用。 现在我正在信号处理程序中创build另一个进程,但是从那里开始,输出变得无限。 输出是这样的:Hello world来到Linux来到UNIX来到Linux来到UNIX来到Linux来到UNIX来… 另外为什么来到Linux打印一遍又一遍。 也请告诉我什么时候拨叫,我知道重复的地址空间是由父母,但信号处理程序呢? 他们也得到重复吗? 在我的情况下,当小孩叫退出。 然后被调用的信号处理程序是孩子或父母。 请帮忙。 谢谢。 void sig_handler(int signo) { if(fork() == 0){ } else{ int pid = 0; wait(&pid); printf("Come to unix"); fflush(stdout); } } int main() { if (signal(SIGCHLD, sig_handler) == SIG_ERR){ } int child_pid; int i; child_pid = fork(); switch (child_pid) { case -1: perror("fork"); […]

进程间通信与pipe道和文件

我使用Linux作为操作系统,并尝试与pipe道和文件沟通三个进程。 它应该与STDIN上的任何文件一起工作。 而pipe道工作得很好,但第二个进程不能正确写入一个字符或第三个阅读。 首先当然我把函数初始化为semlock和semunlock,并且开放pipe道也在那里。 我感谢任何帮助,因为我不知道。 if (!(PID[1] = fork ())) { int BUF_SIZE = 4096; char d[BUF_SIZE]; while (fgets (d, BUF_SIZE, stdin) != NULL) { write (mypipe[1], &d, BUF_SIZE); } } if (!(PID[2] = fork ())) { int reading_size = 0; char r; close (mypipe[1]); semlock (semid1); while (reading_size = read (mypipe[0], &r, 1)) { […]

ENOMEM从系统()popen(),而有足够的内存

我有两个相对较大的应用程序(进程)运行在ARM上的ARM与3个RAM银行(在Linux cmdline:mem = 128M mem = 256M @ 0x90000000 mem = 128M @ 0xA0000000)。 一个应用程序处理用户命令,其间可能会有请求运行普通的Linux shell命令。 这被实现为: if((fp=popen(UserCommand, "r")) == NULL) return(errno)); fgets(ReplyString, 128, fp); Res = pclose(fp); 第一行返回errno = 12 – ENOMEM,即使是像“pwd”这样的最简单的命令,虽然内存很多: root@dm814x-evm:~# free total used free shared buffers Mem: 461472 38576 422896 0 152 Swap: 0 0 0 Total: 461472 38576 422896 据我所知,有超过400MB的可用空间! […]

我的文件服务器程序已经停止僵尸进程

我有一个基于套接字的文件服务器程序,它使用fork为多个客户端提供服务。 运行这个服务器程序后,当我做ps -ef我得到了很多我的服务器的<defunct>subprocess。 我该如何解决这个问题? 以下是我的服务器代码。 提前致谢。 /* This is the server for a very simple file transfer service. This is a "concurrent server" that can handle requests from multiple simultaneous clients. For each client: – get file name and check if it exists – send size of file to client – send file to client, […]

printf(“%d”,i ++)与i ++之间有什么区别; 的printf(“%d”,i)的?

我在Linux学习fork(),两个执行结果不同的程序看起来和我完全一样: 第一个有“正常”的结果,父母和小孩子交替行事: 6 int main(void){ 7 int pid; 8 int i = 0; 9 pid = fork(); 10 if(pid != 0){ 11 while(1) 12 printf("a%d\n",i++); 13 } 14 15 else{ 16 while(1){ 17 printf("b%d\n",i++); 18 } 19 } 20 } $./test1.out “` “` b670071 a656327 b670072 a656328 b670073 a656329 b670074 a656330 b670075 a656331 b670076 a656332 […]

为什么fork()和printf()的输出比我预测的要多?

这是我的小程序: #include <unistd.h> #include <stdio.h> int main() { printf("1"); fork(); printf("2"); fork(); return 0; } 这个代码的输出是12121212 ,我问: 为什么打印超过122 ?

如何通过每次分派新的subprocess多次运行同一个jar文件?

我正在尝试编写一个C ++程序。 该程序需要运行一些jar文件,每运行一次jar文件两次。 问题是程序正确运行每个文件一次。 在第二次我得到一个错误消息,就像虚拟机得到了一个错误的命令。 但是,这是第一次运行jar文件的命令! 这是我得到的红色错误消息的前几行。 Usage: java [-options] class [args…] (to execute a class) or java [-options] -jar jarfile [args…] (to execute a jar file) where options include: -d32 use a 32-bit data model if available -d64 use a 64-bit data model if available -client to select the "client" VM -server to select […]

父/subprocessclosures文件描述符

如果您在父项上执行fork()并创buildsubprocess,然后子closures从forkinheritance的fd。 文件会保持在父母打开,因为他们是独立的? 标准I / O或标准错误呢?

实现一个multithreading的叉子

我正在尝试检查一个multithreading应用程序。 对于单线程应用程序,将进程作为检查点分叉是一种有效的技术。 但是,没有这样的东西像是一个mulithreaded叉子。 任何想法如何实施自己的髓膛叉? 任何参考这样的工作将不胜感激。

双叉使用vfork

您好 我正在写一个服务器的一部分,它应该派遣一些其他的subprocess。 因为我想等待一些进程,并且不用等待完成而派发其他进程,所以我使用双叉进行第二种进程(从而避免了僵尸进程)。 问题是,我的服务器拥有大量内存,所以分叉需要很长时间(甚至是在Linux中使用的copy-on-write fork,它只复制分页表) 我想用vfork()来replacefork(),第二个fork很容易(因为它只调用了child中的execve()),但我找不到任何可以replace第一个的方法。 有谁知道我该怎么做? 谢谢! 服务器是用C ++编写的linux(RH5U4)。