Articles of fork

如何正确接收来自pipe道的数据?

所以我写了一个使用pipe道的程序,并且执行一些算术运算。 我不知道如何debuggingpipe道和不同的stream程,但是从我所看到的,必须与我的pipe道读取数字有关。 所以我的设置到目前为止是儿童创build,并根据他们给定的操作,他们execl的不同程序,将计算pipe道中的书面价值。 我不知道在读取结果之前,是否应该在父项中写入值,然后在父项中执行等待或什么。 我不断得到Z作为我的输出。 所以这是我execl文件之一,其他文件看起来完全一样,它只是显示其相应的操作: #include <iostream> #include <fstream> #include <cstdio> #include <cstdlib> using namespace std; main(int argc, char *argv[]) { int x, y, z; while (read(0, (char *)&x, sizeof(int)) && read(3, (char *)&y, sizeof(int))) { z = x * y; if (argc > 1) cerr << "multiply: " << x << " * […]

用execvp()执行进程时加载用户环境;

我有一个守护进程正在运行,这可能会产生一个进程在传入连接。 这是使用execvp()和fork() 。 问题是,进程不应该以root身份运行,并且进程依赖于正确的用户环境。 所以即时通讯寻求一种方式来加载用户环境。 目前该进程是通过设置gid和uid作为另一个用户执行的。 我已经试过的是使用命令su -l user -c command ,由于某种原因没有工作。 有人有一个想法如何我可以加载用户环境(特别是$HOMEvariables)? 提前致谢。

不要vim“fork”一个shell来执行命令

我正在阅读有关进程组的APUE 。 这本书说, 在大多数作业控制shell中,在fork之后调用此函数( setpgid )以使subprocess设置自己的进程组ID。 其中一个要求是多余的,但是通过这两个过程,我们保证在任何一个过程假定发生这种情况之前,把这个孩子放到它自己的过程组中。 我写了下面这段代码来validation我的理解。 error handling被省略。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(void) { printf("process ID: %d\n", getpid()); printf("process group ID: %d\n", getpgrp()); exit(0); } 输出(直接运行到一个shell): 进程ID:4388 进程组ID:4388 输出(在vim中运行): process ID: 4401 process group ID: 4400 // pid of vim (through ps) 为什么结果不一样? 不要vim fork一个shell来执行命令? 如果是这样,有什么区别或换句话说,为什么进程组ID不像第一个输出那样等于进程ID? 顺便说一下, fork是否总是自动设置subprocess的进程组ID? 我试图在设置它之前打印一个subprocess的进程组ID,并打印了父进程的进程ID。 非常感谢。

使用fork()和C中的pipe道进行前缀符号计算,无需recursion或堆栈(HW)

我有一个任务只使用fork()和pipe()来计算前缀符号。 不允许recursion或使用堆栈。 (这个algorithm很简单) 我花了3天没有运气。 我知道fork()和pipes()是如何工作的,但是我不能像recursion一样运行它们。 我写了一个有趣的recursion函数。 int poss; //global var int prefixNotationCalc(char tokens[30][30], int start) { char * token; poss = start; int op1, op2; token = tokens[poss]; if (isOperator(token) == 0) { poss++; return atoi(token); } else { poss++; int op1 = prefixNotationCalc(tokens, poss); int op2 = prefixNotationCalc(tokens, poss); if (*token == '*') { […]

无法避免subprocessinheritance父进程的cpu关联

我想将父进程关联到一个特定的核心。 在下面的代码中,variablescore是用户提供的参数。 接下来,我想创buildNUM_CHILDREN进程,并且每个进程都以循环方式关联到其中一个内核。 subprocess打破了循环,并做了一些更多的工作(未在代码中显示)。 int child_core = 0; CPU_ZERO(&mask); CPU_SET(core,&mask); if (sched_setaffinity(0, len, &mask) < 0) { perror("sched_setaffinity"); } for(int i = 0 i < NUM_CHILDREN; i++) { pID = fork(); if (pID == 0) { /* child */ CPU_ZERO(&mask); CPU_SET(child_core,&mask); len = sizeof(mask); if (sched_setaffinity(0, len, &mask) < 0) { perror("sched_setaffinity"); } break; } […]

与setpgid竞争条件

在为我的OS课程开发一个程序的时候,我发现了一个有趣的例子,涉及到一个看起来像setpgid的竞争条件。 分别编译下面的每个程序。 执行./test 3 (或任意数字> 2)之后, ps jx将显示所有的infy进程已经放在同一个组中。 ./test 2将显示setpgid尝试移动最后一个进程失败的错误。 取消注释“修复我”行将导致./test 2按预期工作。 任何人都可以提供解释或解决scheme? // test.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> char* args[] = { "./infy", NULL }; int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s [num]\n", argv[0]); return 1; } int num = strtol(argv[1], NULL, 10); if (num […]

C:用scanf分叉

我试过这个代码 #include <stdio.h> #include <sys/types.h> int main(){ int x=3; pid_t pid0=getpid(); pid_t pid1=0; if(fork()==0){ pid1=getpid(); } if(getpid()==pid1){ scanf("%d",&x); printf("%d",x); } return 0; } 而scanf指令完全被忽略。 它只是打印旧的x是3 。 有人可以向我解释这里发生了什么吗?

克隆/ fork / vfork之后,父进程和subprocess具有不同的返回地址

我在centos 6.6上工作,并想为post-clone添加一个post-clone钩子。 我已经将syscall_table[__NR_clone]更改为我的函数,在那里我将栈上的返回地址更改为我的syscall_table[__NR_clone]函数,然后将其跳转到实际的系统调用clone以便在实际系统调用之后,程序将返回到我的post-clonefunction。 由于我在实际的clone发生之前更改了堆栈上的返回地址,所以父进程和subprocess都应该具有相同的返回地址。 但是,只有父进程返回到我post-clone ,而subprocess返回到实际的返回地址。 希望有人能帮我弄清楚为什么这样做。

创build一个进程树

下面的程序应该在每个节点上创build具有N个子节点的深度为K进程树。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void spawnNodes(int curLevel, int levelLimit, int childrenNumber, int nodeNumber, int offset) { if (curLevel == levelLimit) exit(0); curLevel++; printf("(%d, %d) Pid: %d with parent %d\n", curLevel, nodeNumber, getpid(), getppid()); for (int i = 0; i < childrenNumber; i++) { pid_t childPid = fork(); if […]

获取subprocessC ++的执行结果

我一直在尝试实现一个在线裁判,但我卡住了..我使用fork来创build一个subprocess,然后从subprocess我使用系统命令启动程序,我应该testing。 这是我用来testing分级的程序。 这是一个无限循环,但我只是发表评论,使其工作。 #include <stdio.h> int main () { int a, b; scanf ("%d %d", &a, &b); while (1); printf ("%d\n", a + b); return 0; } 而我迄今编码的分级员是 struct timeval start, end; struct rlimit rl, default_memory, default_time; getrlimit (RLIMIT_AS, &default_memory); getrlimit (RLIMIT_CPU, &default_time); pid_t pid = fork (); gettimeofday (&start, NULL); if (pid < 0) […]