如何制作进程以及它们执行不同的分配任务,例如使用fork读取文件或写入文件

how to make processes and they do different assign tasks for example doing reading from a file or writing to a file using fork

本文关键字:文件 读取 任务 fork 分配 进程 何制作 执行      更新时间:2023-10-16

如何制作流程以及它们执行不同的分配任务。我已经写了代码

#include<iostream>
using namespace std;
int main()
int status=0;
{
for(int i=0;i<5;i++)
{
if(fork()==0)
{ cout<<"do some thing"<<endl; }
else
{wait(status); }

}
return 0;
}

这段代码创建了5个进程,但所有进程都将执行相同的操作。我希望他们做不同的任务

最简单的方法是检查fork函数返回的值,它在子进程中等于0,在父进程中等于子进程的进程ID。你可以使用这个事实来构建你的代码如下:

if (fork() == 0)  //Fork a child
{
  //Put child 1 code here
  return 0;
}
if (fork() == 0)  //Fork a child
{
  //Put child 2 code here
  return 0;
}
if (fork() == 0)  //Fork a child
{
  //Put child 3 code here
  return 0;
}
if (fork() == 0)  //Fork a child
{
  //Put child 4 code here
  return 0;
}
if (fork() == 0)  //Fork a child
{
  //Put child 5 code here
  return 0;
}

请注意,在这里把它放在for循环中是没有意义的,因为每个孩子都有自己不同的代码,但如果你想让它适合for循环,那么你应该考虑阅读exec函数,并把你想要的代码放在不同的程序中。

祝好运

使用参数'i'。。新派生的进程可以使用case或if-then-else来调用每个进程的唯一函数。

示例:

  uint32_t spinTillTime0SecChange(void)
  {
     uint32_t spin_count = 1; // time(0) invocation count
     // no measurement, just spinning
     time_t t0 = time(0);
     time_t t1 = t0;
     while (t0 == t1)
     {
        t1 = time(0);
        spin_count += 1;
        DTB::msPause(10);  // uses usleep()
     }
     return(spin_count);
  }

  void child0(int i)
  {
     std::cout << "child0() start " << std::endl;
     int k = 0;
     time_t t0 = time(0) + 10; // spin for 10 seconds
     do {
        std::cout << "child0() " << i << "." << k++ << std::endl;
        (void)spinTillTime0SecChange();
        if (time(0) == t0) break;
     }while(1);
     exit(0);   // do not return
  }
  void child1(int i)
  {
     std::cout << "child1() start " << std::endl;
     int k = 0;
     time_t t0 = time(0) + 10; // spin for 10 seconds
     do {
        std::cout << "child1() " << i << "." << k++ << std::endl;
        (void)spinTillTime0SecChange();
        if (time(0) == t0) break;
     }while(1);
     exit(0);   // do not return
  }
  void child2(int i)
  {
     std::cout << "child2() start " << std::endl;
     int k = 0;
     time_t t0 = time(0) + 10; // spin for 10 seconds
     do {
        std::cout << "child2() " << i << "." << k++ << std::endl;
        (void)spinTillTime0SecChange();
        if (time(0) == t0) break;
     }while(1);
     exit(0);   // do not return
  }
  void child3(int i)
  {
     std::cout << "child3() start " << std::endl;
     int k = 0;
     time_t t0 = time(0) + 10; // spin for 10 seconds
     do {
        std::cout << "child3() " << i << "." << k++ << std::endl;
        (void)spinTillTime0SecChange();
        if (time(0) == t0) break;
     }while(1);
     exit(0);   // do not return
  }
  void child4(int i)
  {
     std::cout << "child4() start " << std::endl;
     int k = 0;
     time_t t0 = time(0) + 10; // spin for 10 seconds
     do {
        std::cout << "child4() " << i << "." << k++ << std::endl;
        (void)spinTillTime0SecChange();
        if (time(0) == t0) break;
     }while(1);
     exit(0);   // do not return
  }

  int main(int /*argc*/, char** /*argv[]*/ )
  {
     uint32_t retVal = 0;
     std::cout << std::endl;
     for (int i = 0; i<5; ++i)
     {
        pid_t childPID = fork();
        if(childPID == 0) // when 0 returned: child context
        {
           switch (i) // from loop, choose what this child will run
           {
           case 0: { child0(i); } break;
           case 1: { child1(i); } break;
           case 2: { child2(i); } break;
           case 3: { child3(i); } break;
           case 4: { child4(i); } break;
           default:
           {
              std::cerr << "out of range i: " << i << std::endl;
              DTB::msPause(10); // uses usleep
           }
           break;
           } // switch (i)
        }
        dtbAssert(childPID >= 0)(childPID); // error check
     }
     // parent context
     std::cout << "parent() context after fork" << std::endl;
     int k = 0;
     time_t t0 = time(0) + 13; // spin for 13 seconds
     do {
        std::cout << "parent() " << " " << " " << k++ << std::endl;
        (void)spinTillTime0SecChange();
        if (time(0) == t0) break;
     }while(1);
     return(retVal);
  }