Articles of 叉

让孩子在fork中等待父母()

这个程序在父进程中得到一个句子,并在subprocess中以大写打印。 我希望孩子等待父母。 我使用sleep()来让subprocess等待。 有没有让孩子等待父母的方法? 我可以用signal()来实现吗? 提前致谢!!! #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/wait.h> #include<sys/ipc.h> #include<sys/shm.h> #include<ctype.h> #define size 50 main() { int pid,shmid,i,key=1234; char *name,*shmaddr; if((shmid=shmget(key,size,IPC_CREAT | 0666)) < 0) { perror("shmget():"); exit(1); } pid=fork(); if(pid < 0) { perror("fork():"); exit(1); } else if(pid == 0) { sleep(5); //making child to wait for parent printf("\t\tCHILD\n\n"); if((shmaddr=shmat(shmid,NULL,0)) == […]

父母怎样才能用一根pipe子给n个孩子发消息?

我想要做的是给每个孩子发一个信息,然后看看哪一个先打印出来。 我试过使用一个pipe道,所以我的代码如下所示: int main() { int pfd[2]; if(pipe(pfd)<0){ perror("pfd error"); exit(1); } int n=5; for(int i=1;i<=n;i++){ pid_t pid=fork(); if(pid<0){ perror("fork error\n"); exit(1); } if(pid==0){ close(pfd[1]); char ms[256]; int h; read(pfd[0],&h,sizeof(int)); read(pfd[0],ms,h*sizeof(char)); cout<<i<<"_"<<ms<<endl; close(pfd[0]); exit(0); } if(pid>0){ close(pfd[0]); } } int j=1; char uzenet[256]; strcpy(uzenet,"start"); int ho=strlen(uzenet); while(j<=n){ if(write(pfd[1],&ho,sizeof(int))==-1){ perror("write error"); exit(1); } if(write(pfd[1],uzenet,ho*sizeof(char))==-1){ perror("write error"); […]

Linux克隆调用的最小堆栈大小?

我一直在clone调用,我注意到不同的子线程堆栈分配的三个不同的结果。 下面的演示分配一个栈n- bytes大,其中n作为parameter passing,然后尝试克隆。 foo.c : #define _GNU_SOURCE #include <stdlib.h> #include <unistd.h> #include <sched.h> #include <errno.h> int child(void *arg) { (void)arg; write(STDOUT_FILENO, "carpe momentum\n", 15); return 0; } int main(int argc, char **argv) { long stacksize; pid_t pid; void *stack; if (argc < 2) return 1; errno = 0; stacksize = strtol(argv[1], NULL, 0); if […]

Linux shell模拟:卡在多个pipe道上

我知道类似的问题已经被问到,但没有答复帮助我。 我试图实现一个微型的Linuxshell,并坚持在多个pipe道。 带有单个pipe道的命令(例如ls | wc )可以工作,但是如果我添加第二个pipe道,控制台上不会显示任何内容。 这是我的代码。 void ExecuteCommand(NODE *cHead,NODE *oHead) { int fd[10][2]; // file descriptors' array int nfdCnt = 0 ; // file descriptors counter string strCmd; // command string strOp = ""; // operator int nOpCnt = 0 ; // operator count while(1) { if (cHead != NULL) // cHead is head […]

C多个进程写入1个pipe道

您好Linux系统(Centos 6.5) 我创build一个pipe道,然后尝试分叉一些subprocess。 我想让subprocess写入同一个分支。 (我不关心同步)。 我发现只有第一个分支进程可以写入所有后续进程得到“错误的文件描述符”hibernate调用只用于debugging。 示例代码: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <err.h> int pipes[2]; #define FOREVER for(;;) int main(int argc, char *argv[]) { int rc; int k; int nbytes; char buffer[4096]; rc = pipe(pipes); if (rc <0) { perror(" Main error with pipes \n"); exit(2); } for (k […]

叉100同时进行,有时一些进程变成僵尸

我尝试在下面的代码中同时启动100个进程: int cnt = 0; void sig_handler(int signo) { pid_t pid; int stat; pid = wait(&stat); cout << "cnt:" << ++cnt << ", pid:" << pid << " signal:" << signo << endl; } int main() { signal(SIGCHLD, sig_handler); for (int i = 0; i < 100; ++i) { if (fork() == 0) { sleep(1); […]

意外的行为与共享内存和分叉?

给出以下代码: #include <sys/types.h> #include <sys/shm.h> #include <stdio.h> #include <sys/types.h> int main() { int arr[100]; int shmid = shmget(IPC_PRIVATE, sizeof(int), 0600); int *ptr = shmat(shmid, NULL, 0); *ptr = 42; arr[0] = 1; if (fork()) { wait(NULL); printf("%d, %d\n",arr[0],*ptr); } else { arr[0] = 2; *ptr = 1337; } return 0; } 输出是: 1,1337 。 问:为什么不是2,1337 […]

从pipe道读取()保证在EOF之前提供所有primefaces写入的数据?

我正在使用一个简单的fork()父子示例来让孩子生成一些数据,然后write()其write()为父。 孩子会primefaces地将less于64kib (65536字节)的数据写入pipe道。 父节点从pipe道中读取数据,当它接收到EOF (即:假设远端已closures)时,它会继续执行一些处理逻辑,并在其方便的时候closures,并且不关心需要多长时间终止。 是否保证能够读取在遇到EOF之前发送的所有客户端数据,或者在读取所有数据之前是否有任何潜在的操作系统级逻辑启动以触发EOF ? 我发现了一个非常类似的问题,但没有收到权威/引用的答案。 谢谢。

clone()系统调用是否最终依赖于fork函数?

对于我正在使用的类,我一直在使用Linux中的clone()系统调用直接做一些工作。 我很好奇它是如何工作的,并开始做一些挖掘工作。 令我困惑的是,它似乎依赖于一些与fork()函数相同的基础(他们调用相同的do_fork()函数,尽pipe有不同的参数)。 一方面,这对我来说是有道理的,因为一个线程实际上只是一个轻量级的过程,但我一直觉得线程创build的方式和创build过程的方式之间有一些显着的差异。 我做了一些深入的do_fork()和后续copy_process() ( do_fork()调用)的实现,但我还没有能够说服自己我明白发生了什么事情。 所以,对于那位大师来说,我是否错过了一些东西呢? 是否有旗帜基本上告诉操作系统多less复制以及什么指令开始执行新的任务(我想答案是肯定的 ,但我只是不知道他们如何翻译)? 下面是我正在看的代码,也许你可以解释如何通过参数控制是否创build一个轻量级或重量级的过程。 asmlinkage int sys_fork(struct pt_regs *regs){ #ifdef CONFIG_MMU return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); #else /* can not support in nommu mode */ return(-EINVAL); #endif } asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, int __user *parent_tidptr, int tls_val, int __user *child_tidptr, struct pt_regs […]

使用pipe道发送多个string到subprocess

我在Linux有一个任务,我不能得到它的工作。 我有一个程序接收一个文本文件作为参数。 然后使用fork()创build一个subprocess,并将接收到的文本文件的内容作为参数逐行发送给subprocess。 subprocess需要对行进行计数,并返回父进程收到的行数。 这是我到现在为止,但有点儿童进程并没有收到所有的线。 对于我的testing,我用了9行的文本文件。 父母发送9行作为string,但subprocess只收到2或3个。 我究竟做错了什么? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char string[80]; char readbuffer[80]; int pid, p[2]; FILE *fp; int i=0; if(argc != 2) { printf("Syntax: %s [file_name]\n", argv[0]); return 0; } fp = fopen(argv[1], "r"); if(!fp) { printf("Error: File '%s' does not exist.\n", argv[1]); […]