创建一个包含 n 个子流程的链
Create a chain of n sub processes
在c++中创建n个进程链,以n为输入,进程的输出应该是parent1->child1(parent2)-->child2(parent3),通过使用递归函数我能够生成输出但是无法退出循环 我还需要帮助来发送循环应该中断的 n 输入。
下面是我的代码:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int foo(const char *whoami) {
printf("I am a %s. My pid is:%d my ppid is %d\n", whoami, getpid(), getppid() );
return 1;
}
int func() {
pid_t pid=fork();
if (pid==0) { /* only execute this if child */
foo("child");
pid_t pid=fork();
if (pid==0) { /* only execute this if child */
foo("child");
func();
exit(0);
}
}
exit(0);
}
wait(0); /* only the parent waits */
return 0;
}
int main(void){
foo("parent");
func();
return 0;
}
根据你所说的,我了解到你遇到了以下问题:
第一。您正在尝试将 'data' 从一个进程发送到另一个进程
第二。您正试图从 运行.
中找到停止程序的方法
现在是第一个。如果您想这样做并且我理解正确,有两种方法可以实现。一种是使用共享内存,另一种是使用管道。共享内存在做什么方面非常明显。管道正在获取进程的 stdout
并将其重定向为下一个进程中的 stdin
。
现在您需要关闭您的程序。子进程在执行命令(exec
)或被告知(例如使用 IF 语句和 return)时执行。你可以创建一个你喜欢的声明,当一个子进程满足你的要求时,你就可以让它消亡(还有一种方法是用kill(pid, SIGKILL);
命令从子进程中杀死父进程。
我没有向您提供任何代码,因为我不清楚您问题的确切性质。
希望我的假设让你有所收获!
您无法退出循环的原因很简单,那就是您会无休止地生成子进程。每当你 fork()
一个新进程启动时,它就会再次分叉。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int n=5;
int foo(const char *whoami) {
printf("I am a %s. My pid is:%d my ppid is %d\n", whoami, getpid(), getppid() );
return 1;
}
int func(int n)
{
if (n == 0)
{
return 0;
}
int pid = fork();
if (pid == -1) {
exit(0);
}
if (pid==0) {
foo("child");
n = n-1;
func(n);
exit(0);
}
else {
wait(NULL);
}
return 0;
}
int main()
{
func(n);
return 0;
}
gcc -std=c99 prog.c -o prog
./prog
输出:
I am a child. My pid is: 1159 my ppid is 1158
I am a child. My pid is: 1160 my ppid is 1159
I am a child. My pid is: 1161 my ppid is 1160
I am a child. My pid is: 1162 my ppid is 1161
I am a child. My pid is: 1163 my ppid is 1162
在c++中创建n个进程链,以n为输入,进程的输出应该是parent1->child1(parent2)-->child2(parent3),通过使用递归函数我能够生成输出但是无法退出循环 我还需要帮助来发送循环应该中断的 n 输入。
下面是我的代码:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int foo(const char *whoami) {
printf("I am a %s. My pid is:%d my ppid is %d\n", whoami, getpid(), getppid() );
return 1;
}
int func() {
pid_t pid=fork();
if (pid==0) { /* only execute this if child */
foo("child");
pid_t pid=fork();
if (pid==0) { /* only execute this if child */
foo("child");
func();
exit(0);
}
}
exit(0);
}
wait(0); /* only the parent waits */
return 0;
}
int main(void){
foo("parent");
func();
return 0;
}
根据你所说的,我了解到你遇到了以下问题:
第一。您正在尝试将 'data' 从一个进程发送到另一个进程
第二。您正试图从 运行.
中找到停止程序的方法现在是第一个。如果您想这样做并且我理解正确,有两种方法可以实现。一种是使用共享内存,另一种是使用管道。共享内存在做什么方面非常明显。管道正在获取进程的 stdout
并将其重定向为下一个进程中的 stdin
。
现在您需要关闭您的程序。子进程在执行命令(exec
)或被告知(例如使用 IF 语句和 return)时执行。你可以创建一个你喜欢的声明,当一个子进程满足你的要求时,你就可以让它消亡(还有一种方法是用kill(pid, SIGKILL);
命令从子进程中杀死父进程。
我没有向您提供任何代码,因为我不清楚您问题的确切性质。 希望我的假设让你有所收获!
您无法退出循环的原因很简单,那就是您会无休止地生成子进程。每当你 fork()
一个新进程启动时,它就会再次分叉。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int n=5;
int foo(const char *whoami) {
printf("I am a %s. My pid is:%d my ppid is %d\n", whoami, getpid(), getppid() );
return 1;
}
int func(int n)
{
if (n == 0)
{
return 0;
}
int pid = fork();
if (pid == -1) {
exit(0);
}
if (pid==0) {
foo("child");
n = n-1;
func(n);
exit(0);
}
else {
wait(NULL);
}
return 0;
}
int main()
{
func(n);
return 0;
}
gcc -std=c99 prog.c -o prog
./prog
输出:
I am a child. My pid is: 1159 my ppid is 1158
I am a child. My pid is: 1160 my ppid is 1159
I am a child. My pid is: 1161 my ppid is 1160
I am a child. My pid is: 1162 my ppid is 1161
I am a child. My pid is: 1163 my ppid is 1162