Распечатка 10.6 Перенос приложений на uClinux |
Предыдущая Содержание Следующая |
Распечатка 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"); } } }
|
Предыдущая Содержание Следующая |