Я играю с ampersand “&”
. Я понимаю, что в сценарии оболочки bash
амперсанд используется для разветвления процессов, но будет работать в фоновом режиме. Это полезно, поскольку позволяет вам немедленно вернуться к подсказке и запустить процесс в фоновом режиме.
Пожалуйста, обратите внимание на следующий код:
#include <stdio.h>
#include <unistd.h>
int x=5;
void main()
{
int pid = getpid();
int y=6;
printf("[%d] [%p] x = %d\n", pid, &x, x++);
printf("[%d] [%p] y = %d\n", pid, &y, y++);
}
После успешной компиляции я запускаю код с помощью:
> ./a.out & ./a.out & ./a.out
Результаты первого запуска:
[4436] [0x601058] x = 5
[4435] [0x601058] x = 5
[4436] [0x7fff2d481bd8] y = 6
[4435] [0x7fff7ecadd88] y = 6
[4437] [0x601058] x = 5
[4437] [0x7fff6e0741d8] y = 6
Результаты второго запуска:
[4469] [0x601058] x = 5
[4469] [0x7fffa00048b8] y = 6
[4470] [0x601058] x = 5
[4470] [0x7fffd447a798] y = 6
[4468] [0x601058] x = 5
[4468] [0x7fffc35dc7b8] y = 6
Наблюдения:
- Некоторые операторы печати отображаются в другом порядке, поскольку все процессы выполняются одновременно.
- Адрес переменной x одинаков во всех экземплярах, потому что это глобальная переменная.
- Значение x одинаково во всех случаях, потому что оно каждый раз сбрасывается до 5.
- Переменная y локальна только для main(), поэтому ее адрес будет уникальным в каждом процессе.
Вот мои вопросы:
- Причина, по которой некоторые операторы печати появляются в другом порядке, определяется тем, какой процесс был запущен первым планировщиком ОС?
- Поскольку переменная x является глобальной и, кажется, сохраняет один и тот же адрес во всех запусках/экземплярах. Почему его значение не распределяется между процессами после автоинкремента? Почему НИ ОДИН процесс не печатает увеличенное значение x?
&
процессы запускаются форком. Важное отличие состоит в том, что оболочка не ждет завершения дочернего процесса. (Есть и другие детали.) - person William Pursell   schedule 10.11.2014