【问题标题】:fork ( ) - C programmingfork ( ) - C 编程
【发布时间】:2014-09-16 14:54:04
【问题描述】:

我在确定一个好的起点是什么时遇到了问题, 我已经对我真正需要做的事情提出了几点意见,但我不确定这是否完全有可能。

  • 我有一个文件要运行多个
  • 实例
  • 我想为文件的每个进程分配一个新 ID
  • 我需要分配一个字符,例如。通过 argv[1] 给进程的“A”
  • 如果已经有一个给定 char 的进程,打印到 stderr

到目前为止,

我在想的是,有类似下面的功能。但我真的不太确定, 任何帮助都会很棒。

int createProcess(char *argv[]){

    //argv[1] is given 'A'
    //fork() 
    //getPID()
    //assign PID to 'A'
}

【问题讨论】:

  • 澄清一下——我不指望有人写我的函数,只是可能的解释:)
  • 一个文件的多个实例?什么?
  • 将PID分配给'A',这是什么意思?

标签: c unix process fork argv


【解决方案1】:

我认为您正在寻找 fork 和 execl 的组合。您可以分叉创建多个实例,然后使用 exec 将其中一个分叉进程替换为另一个进程(在您的情况下,它是同一个进程)。通过 execl 您可以提供命令行参数。您可能需要在 exec'd 进程中使用 sprintf,在原始进程中使用 sscanf。我想这已经足够暗示了。

【讨论】:

    【解决方案2】:
    I have a file that I want to run multiple instances of 
    

    要做到这一点,您有两种选择:
    1. 您可以使用多个 fork() 系统调用来复制新的子进程并在这些进程中打开文件。
    2. 程序中可以有多个线程打开同一个文件。

    但是看看接下来的三个点,fork() 是可以选择的。

    I want a new ID assigned to each process for the file 
    

    当您使用 fork() 复制进程时,每个进程都会获得自己唯一的进程 ID(pid)。

    I need to assign a char eg. 'A' that was given through argv[1] to a process 
    

    为此,您需要使用“exec”系列中的众多调用之一。通过使用“exec”
    您还可以将命令行参数传递给新创建的进程。
    这不能通过 fork 完成,因为 fork 用于复制当前进程,而如果要创建一个全新的进程,则必须使用 exec 调用。

    编辑:

    为了获取传递给进程的命令行参数,您需要
    知道它的进程ID,然后你可以寻找一个名称与pid相同的目录
    在 /proc 文件系统内(未安装在实际设备上)。当你找到目录
    您将在名为“cmdline”的文件中获取传递给它的参数。
    有关更多详细信息,您可以阅读“/proc”文件系统。

    【讨论】:

      【解决方案3】:

      您将需要创建多个分叉(最好是迭代)并为您的孩子建立索引。* 一种方法是让原始父级循环,并且只让该进程执行分叉。原始父进程循环k 次,每次迭代只创建一个子进程。在创建的子进程上,您只执行当前子进程将执行的操作,例如分配标识符(例如循环计数器),执行exec,并在子进程执行完所有操作后退出,这样它就不会进入下一次迭代fork 创建孙子。

      请注意,调用fork() 是一个系统调用,它会导致原始进程(现在称为父进程)创建一个副本(称为子进程),以及只为父进程返回一个 int 值。

      您需要注意的一点是,分叉的进程是相同的,只有两个例外:fork() 返回的值和进程 pid(child 通常有更高的 pid)。 parent 返回的值是 child 的 PID。子进程的值始终为零。识别 fork() 的返回值是识别它是父进程还是子进程的唯一方法。

      我有一个文件要运行多个实例

      您可能需要结合使用fork()exec。目前尚不清楚您要运行哪种类型的文件。您是在读取文件、写入文件还是执行文件?

      我想为文件的每个进程分配一个新 ID

      在创建新进程时,PID 本身就是一个新的唯一 ID。但是,您可以使用计数器,以便只有父进程可以创建多个子进程,每个子进程都有一个唯一的 ID。

      我需要分配一个字符,例如。通过 argv[1] 给进程的“A” argv[1] 是字符串(char 数组),而不是 char。

      如果已经有给定字符的进程,打印到标准错误 您可以跟踪原始父项上的所有标识符字符。

      这是一些示例 C 代码,其中只有父级创建分叉:

      int main() {
          for (int k = 1; k <= 16; k++) {
              int r = fork();
              if (r == 0) { // kth CHILD
                  printf("[%d] %d\n", getpid(), k);
                  exit(0);
              }
              else if (r > 0) {
                  int status;
                  wait(&status);
                  printf("[%d] P\n", getpid());
              }
              else return 1;
          }
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        如果我正确理解您想要的是将不同的字符“分配”给分叉进程的不同实例。 你可以这样做:

        #include <stdio.h>
        #include <unistd.h>
        
        int main(int argc, char *argv[]){
             char chr = *argv[1];
             pid_t res;
        
             res = fork();
             if (!res)
                 chr++;
             printf("%c \n",  chr);
             return 0;
        }   
        

        【讨论】:

          猜你喜欢
          • 2019-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-27
          • 2012-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多