如何区分一个子进程和其他子进程

时间:2016-03-17 01:03:29

标签: c multithreading

我上课了,我对这部分要求感到困惑。因此,我们需要创建一个具有n个进程的多进程字计数器,n将是该程序的输入参数。每个过程需要对输入文件的选择部分进行它们自己的迷你字数。因此,基本上输入的文件将被分成1 / n个部分并在n个进程之间分割。

我理解如何通过for循环分叉进程以及如何使用管道将子进程中的迷你字数发送到父进程,但我不确定如何告诉某个进程执行选择部分输入文件。

您是否会使用他们的PID值来检查他们的流程然后为他们分配任务?

到目前为止,这是我的代码。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MSGLEN  64
#define MESSES  3

int main(){
int     fd[2];
pid_t   pid;
int     result;

//Creating a pipe
result = pipe (fd);
if (result < 0) {
    //failure in creating a pipe
    perror("pipe error\n");
    exit (1);
}

//Creating a child process
for(int i = 0; i < MESSES; i++){
if ((pid = fork()) < 0) {
     //failure in creating a child
     perror ("fork error\n");
     exit(2);
    }
if(pid == 0)
   break;
}

if (pid == 0) {
    // ACTUALLY CHILD PROCESS
     char message[MSGLEN];

        //Clearing the message
        memset (message, 0, sizeof(message));
        printf ("Enter a message: ");
        //scanf ("%s",message);

        fgets (message, 1024, stdin);
    close(fd[0]);   

        //Writing message to the pipe
        write(fd[1], message, strlen(message));

        close(fd[1]);
    close(fd[0]);
        exit (0);
}
else {
    //Parent Process

     char message[MSGLEN];
 char *ptr;
 long wc;
 close(fd[1]);

     while (1) {
                //Clearing the message buffer
                memset (message, 0, sizeof(message));

                //Reading message from the pipe

                if(read(fd[0], message, sizeof(message)) == 0)
        exit(0);
                printf("Message entered %s\n",message);
                /*
                Message entered needs to be in the format of number first space then string for it to work
                */

                wc = 0;

                wc = strtol(message, &ptr, 10);
                printf("The number(unsigned long integer) is %ld\n", wc);
                printf("String part is %s", ptr);



        }
    close(fd[0]);
    wait(NULL);
       // exit(0);
 }
 return 0;
}

1 个答案:

答案 0 :(得分:0)

使用fork时要记住的关键是父和子共享相同的内存,并将父项所有内容的副本传递给子项。此时孩子已经分叉父母数据

在下面的代码中,我们计算了我们创建的流程数量。如果你想在孩子中使用它作为参数,你可以使用它,即 nth 孩子获得值 n

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define PROCESS_COUNT 50

int main(void) {
  pid_t pid;
  size_t pid_count = 0;
  //pid_t  pid_array[PROCESS_COUNT];
  for(int i = 0; i < PROCESS_COUNT; i++) {
    if ((pid = fork()) < 0) {
      perror ("fork error\n");
      exit(2);
    }   
    if (pid == 0) {//child
      size_t n = 0;
      size_t p = getpid();
       while(n++ < 2) {
         //Next line is illustration purposes only ie I'm taking liberties by
         //printing a pid_t value
         printf("child %zu  has pid_count == %zu\n", p, pid_count);
         sleep(1);
       }   
       exit (0);
    }   
    else {
      //Count how many process we've created.
      pid_count++;
      int status;
      waitpid( -1, &status, WNOHANG);
    }   
  }
  wait(NULL);
  return 0;
}

如果您想真正想要的话,可以使用管道或共享内存来使用IPC。有很多方法可以将数据从一个进程传递到另一个进程,有时像临时文件这样简单的东西就足够了。对于您的问题,我使用mmap但不需要那么复杂