Linux getppid函數(shù)如何與其他系統(tǒng)調(diào)用結(jié)合使用

小樊
84
2024-09-29 18:55:14

getppid() 函數(shù)在 Linux 中用于獲取當(dāng)前進(jìn)程的父進(jìn)程 ID(Process ID)。這個(gè)函數(shù)可以與其他系統(tǒng)調(diào)用結(jié)合使用,以便在一個(gè)進(jìn)程中對(duì)另一個(gè)進(jìn)程進(jìn)行操作或監(jiān)控。以下是一些示例,展示了如何將 getppid() 與其他系統(tǒng)調(diào)用結(jié)合使用:

  1. 使用 fork() 創(chuàng)建子進(jìn)程:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) { // 子進(jìn)程
        printf("I am the child process, my parent's PID is %d\n", getppid());
        _exit(0);
    } else if (pid > 0) { // 父進(jìn)程
        printf("I am the parent process, my child's PID is %d\n", pid);
        wait(NULL); // 等待子進(jìn)程結(jié)束
    } else {
        perror("fork");
        return 1;
    }

    return 0;
}
  1. 使用 exec() 執(zhí)行另一個(gè)程序,并在新程序中獲取父進(jìn)程 ID:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) { // 子進(jìn)程
        printf("I am the child process, my parent's PID is %d\n", getppid());
        execlp("ls", "ls", NULL); // 在子進(jìn)程中執(zhí)行 ls 命令
        perror("execlp");
        return 1;
    } else if (pid > 0) { // 父進(jìn)程
        printf("I am the parent process, my child's PID is %d\n", pid);
        wait(NULL); // 等待子進(jìn)程結(jié)束
    } else {
        perror("fork");
        return 1;
    }

    return 0;
}
  1. 使用 kill() 向父進(jìn)程發(fā)送信號(hào):
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void signal_handler(int sig) {
    printf("Received signal %d from parent process\n", sig);
}

int main() {
    pid_t pid = fork();

    if (pid == 0) { // 子進(jìn)程
        signal(SIGINT, signal_handler); // 設(shè)置子進(jìn)程的信號(hào)處理器
        printf("I am the child process, my parent's PID is %d\n", getppid());
        while (1) {
            sleep(1);
        }
    } else if (pid > 0) { // 父進(jìn)程
        printf("I am the parent process, my child's PID is %d\n", pid);
        kill(pid, SIGINT); // 向子進(jìn)程發(fā)送 SIGINT 信號(hào)(例如,Ctrl+C)
        wait(NULL); // 等待子進(jìn)程結(jié)束
    } else {
        perror("fork");
        return 1;
    }

    return 0;
}

這些示例展示了如何將 getppid()fork()、exec()kill() 系統(tǒng)調(diào)用結(jié)合使用。通過(guò)這些組合,您可以在一個(gè)進(jìn)程中創(chuàng)建、監(jiān)控和控制另一個(gè)進(jìn)程。

0