Распечатка 10.6 Перенос приложений на uClinux

Предыдущая  Содержание  Следующая V*D*V

Распечатка 10.6

 

/* Пример программы для обычного Linux */

 

/* fork.c */

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

 

int main(int argc, char *argv[])

{

  pid_t pid;

  /*

   * Если fork возвращает -1, это означает, что вызов fork

   * закончился неудачей при создании дочернего процесса.

   * В родительский процесс возвращается pid дочернего процесса.

   * В дочернем процессе возвращается 0.

   */

  if ((pid = fork()) < 0) {

    printf("Fork() failed\n");

    exit(1);

  }else if (pid != 0) {

    /* Код родителя */

    printf(“Parent exiting.\n”);

    exit(0);

  }

  /* Код потомка */

  printf(“Starting child...\n”);

  while (1) {

    sleep(2);

    printf("...Child running\n");

  }

}

 

/* Показанное выше приложение может быть перенесено на uClinux */

 

/* vfork.c */

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

 

int main(int argc, char *argv[])

{

  pid_t pid;

  int c_argc = 0;

  char *c_argv[3];

  char child=0;

 

  /* Определяя потомка, мы используем системный аргумент argv[1]=child */

  if (argc > 2 && !strcmp(argv[1],”child”)) child=1;

 

  /* используем vfork(), возвращаемые значения аналогичны fork() */

  if (!child) {

    if ((pid = vfork()) < 0) {

      printf("vfork() failed\n");

      exit(1);

    } else if (pid != 0) {

      /* Код родителя */

      printf(“Parent exiting.\n”);

      exit(0);

    }

 

    /*

     * Здесь вызывается exec потомка. Для идентификации потомка

     * мы передаём специальный аргумент

     */

    c_argv[c_argc++] = argv[0];

    c_argv[c_argc++] = "child";

    c_argv[c_argc++] = NULL;

    execv(c_argv[0], c_argv);

 

    /* Заметим, что если всё успешно, execv никогда не вернётся */

    printf(“execv() failed\n”);

    exit(1);

 

  }else { // Код потомка

    printf(“Starting child...\n”);

    while (1) {

      sleep(2);

      printf("...Child running\n");

    }

  }

}

 

Предыдущая  Содержание  Следующая