Я изучаю компьютерные системы, и я сделал эту очень простую функцию, которая использует fork()
для создания дочернего процесса. fork()
возвращает pid_t
, то есть 0, если это дочерний процесс. Но вызов функции getpid()
в этом дочернем процессе возвращает другой ненулевой pid. В приведенном ниже коде есть newPid
только значимый в контексте программы, а не в операционной системе? Возможно ли это только относительное значение, измеренное против pid родителя?Может ли процесс иметь два PID?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
void unixError(char* msg)
{
printf("%s: %s\n", msg, strerror(errno));
exit(0);
}
pid_t Fork()
{
pid_t pid;
if ((pid = fork()) < 0)
unixError("Fork error");
return pid;
}
int main(int argc, const char * argv[])
{
pid_t thisPid, parentPid, newPid;
int count = 0;
thisPid = getpid();
parentPid = getppid();
printf("thisPid = %d, parent pid = %d\n", thisPid, parentPid);
if ((newPid = Fork()) == 0) {
count++;
printf("I am the child. My pid is %d, my other pid is %d\n", getpid(), newPid);
exit(0);
}
printf("I am the parent. My pid is %d\n", thisPid);
return 0;
}
Выход:
thisPid = 30050, parent pid = 30049
I am the parent. My pid is 30050
I am the child. My pid is 30052, my other pid is 0
Наконец, почему PID ребенка 2 выше, чем у родителя, а не 1? Разница между pid главной функции и ее родителем равна 1, но когда мы создаем дочерний элемент, он увеличивает pid на 2. Почему?
Разъясняется отлично. Спасибо, что поняли это. –
Я полагаю, вы хотели напечатать результат от 'getpid' у ребенка? Теперь он печатает 0. –
Действительно, спасибо, что указали это. – tomahh