q0987
q0987

Reputation: 35982

Why getppid and getpid return the same value

/*  In alarm.c, the first function, ding, simulates an alarm clock.  */

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

static int alarm_fired = 0;

void ding(int sig)
{
    alarm_fired = 1;
}

/*  In main, we tell the child process to wait for five seconds
    before sending a SIGALRM signal to its parent.  */

int main()
{
    pid_t pid;

    printf("alarm application starting\n");

    pid = fork();
    switch(pid) {
    case -1:
      /* Failure */
      perror("fork failed");
      exit(1);
    case 0:
      /* child */
        sleep(5);
        printf("getppid: %d\n", getppid()); // Question: why this line produces the same value as getpid?
        kill(getppid(), SIGALRM);
        exit(0);
    }

/*  The parent process arranges to catch SIGALRM with a call to signal
    and then waits for the inevitable.  */

    printf("waiting for alarm to go off\n");
    (void) signal(SIGALRM, ding);

    printf("pid: %d\n", getpid()); // Question: why this line produces the same value as getppid?
    pause();
    if (alarm_fired)
        printf("Ding!\n");

    printf("done\n");
    exit(0);
}

I have run the above code under Ubuntu 10.04 LTS

> user@ubuntu:~/Documents/./alarm
> alarm application starting
> waiting for alarm to go off
> pid: 3055
> getppid: 3055
> Ding!
> done

Upvotes: 1

Views: 5467

Answers (1)

c00kiemon5ter
c00kiemon5ter

Reputation: 17634

Uhm, cause inside the child you call getppid which returns the child's parent-pid. and inside the parent you call getpid which returns the parent's (own) pid.

Calling getppid (get parent pid) from child is the same as calling getpid from the parent.

So the value is the same. Isn't that straightforward and expected ?

Upvotes: 10

Related Questions