Tag: fork

如何在C中获得子PID?

我正在for -loop中创建子进程。 在子进程内部,我可以使用getpid()检索子PID。 但是,出于某种原因,当我尝试将getpid()的值存储到父进程声明的变量中时,当我在父进程中检查它时,更改无效。 我假设这与某种过程变量范围有关。 不太熟悉C,所以不能太确定。 无论如何,将子PID的getpid()结果getpid()从子进程调用时)存储到父进程的变量中的方法是什么? 或者另一种方法是将fork()存储到父变量中并在该变量上调用一些函数来检索子节点的PID? 我不知道怎么做,所以如果这是更好的方法,你会怎么做?

C fork处理全局变量

我不理解这个程序的输出: #include #include #include int i = 0; int main() { while(i<3) { fork(); printf("%d\n",i); ++i; } } 输出是: 0 1 2 2 1 2 0 1 2 2 2 1 2 2 可以请有人告诉我如何解决这个问题,以便完全理解为什么我得到这个输出?

共享内存有两个进程在C?

我想做以下事情: 父进程创建子进程。 然后子进程从用户读取n int并将它们存储在共享内存中。 然后父进程显示它们。 我达到了以下目的: #include #include #include #include #define SHMSIZE 27 int main() { int shmid; int *shm; int *n; if(fork() == 0) { shmid = shmget(2009, SHMSIZE, 0); shm = shmat(shmid, 0, 0); n = shm; int i; for(i=0; i<5; i++) { printf("Enter number: “, i); scanf(“%d”, n++); } printf (“Child wrote […]

vfork()调用后退出和返回之间的区别

我有一个程序具有未定义的行为(vfork()使用不当): #include #include #include int main ( int argc, char *argv[] ) { pid_t pid; printf(“___________befor fork______________.\n”); if((pid=vfork()) 0) printf(“parent\n”); else printf(“child\n”); printf(“pid: %d, ppid: %d\n”, getpid(), getppid()); //exit(0); return 0; } 如果我使用exit(0)函数而不是return – 输出是: ___________befor fork______________. child pid: 4370, ppid: 4369 parent pid: 4369, ppid: 2924 如果我使用return 0 – 我得到无限输出: ___________befor fork______________. child pid: […]

getpid和getppid返回两个不同的值

当我运行下面的代码时 #include #include //int i=0; int main(){ int id ; id = fork() ; printf(“id value : %d\n”,id); if ( id == 0 ) { printf ( “Child : Hello I am the child process\n”); printf ( “Child : Child’s PID: %d\n”, getpid()); printf ( “Child : Parent’s PID: %d\n”, getppid()); } else { printf […]

这里分叉了多少个进程

我知道这可能是一个愚蠢的问题,但任何人都可以帮助我理解以下代码片段的行为 //label 0 int main(){ fork();//label 1 fork();//label 2 fork();//label 3 return 0; } 据我所知,进程树就是这样的 [0] / | \ [1] [2] [3] / \ | [2] [3] [3] | [3] 我对吗? 如果是这样的话,我很困惑为什么第二个fork不会产生对应于label 1 fork的进程,而第三个fork不再产生任何进程。 我的意思是子进程是父进程的精确副本(至少在代码中),因此它必须完整地执行其父进程的代码。 任何人都可以帮助我解决这个困惑……

C execv()函数是否终止子进程?

下面是我的代码细分。 我有一个程序,它会分叉一个孩子(并将孩子的pid注册到一个文件中),然后做自己的事情。 孩子成为程序员用argv尊严的任何程序。 当子进程执行完毕后,它会向父进程发送一个信号(使用SIGUSR1),以便父进程知道从文件中删除子进程。 父节点应该停止一秒,通过更新其表来确认已删除的条目,并从中断处继续。 pid = fork(); switch(pid){ case -1:{ exit(1); } case 0 :{ (*table[numP-1]).pid = getpid(); //Global that stores pids add(); //saves table into a text file freeT(table); //Frees table execv(argv[3], &argv[4]); //Executes new program with argv printf(“finished execution\n”); del(getpid()); //Erases pid from file refreshReq(); //Sends SIGUSR1 to parent return 0; } […]

使用系统调用fork()的多个管道实现execvp()wait()pipe() – 它根本不起作用

我需要实现处理多个管道命令的shell。 例如,我需要能够处理这个: ls | grep -i cs340 | sort | uniq | cut -c 5 ls | grep -i cs340 | sort | uniq | cut -c 5 ls | grep -i cs340 | sort | uniq | cut -c 5 。 我假设问题是我没有将前一个命令的输出传递给下一个命令的输入。 当我执行我的代码时,它没有给我输出。 我正在使用这个伪代码: for cmd in cmds if there is a next cmd […]

如何正确使用fork()和exec()

我有这个代码; pid_t process; process = fork(); if (process < 0){ //fork error perror("fork"); exit(EXIT_FAILURE); } if (process == 0){ //i try here the execl execl ("process.c", "process" , n, NULL); } else { wait(NULL); } 我不知道fork()和exec()是否正确。 当我尝试从bash运行程序时,我没有收到任何结果,所以我认为这部分代码可能存在问题。 谢谢。

如何使用fork()和exec()在Mac OS上创建进程

我正在研究一个相对简单,独立的“ 流程启动器 ”,我希望能够在Windows(XP,Vista,7),Linux(Ubuntu 10.10)以及特别是Mac OS X (10.6)上工作。 Linux和Windows基本上都可以工作,但我在使用Mac版时遇到了一些麻烦。 我希望fork()和exec()函数在Mac OS下可以像在Linux中一样工作。 所以我的第一个问题是: 我应该使用它们在Mac上创建进程还是要使用任何特定于平台的function? 我目前的代码(在Linux下工作正常)来调试它看起来像这样: pid_t processId = 0; if (processId = fork()) == 0) { const char * tmpApplication = “/Path/to/TestApplication”; int argc = 1; char * argv[argc + 1]; argv[0] = tmpApplication; argv[1] = NULL; execv(tmpApplication, argv); }else { //[…] } 不知道这是否可以在Mac OS X下运行,因为我的子进程根本没有启动,而没有出现错误。 谢谢!