getppid()
函數在 Linux 中用于獲取當前進程的父進程 ID(Process ID)。這個函數可以與其他系統調用結合使用,以便在一個進程中對另一個進程進行操作或監控。以下是一些示例,展示了如何將 getppid()
與其他系統調用結合使用:
fork()
創建子進程:#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) { // 子進程
printf("I am the child process, my parent's PID is %d\n", getppid());
_exit(0);
} else if (pid > 0) { // 父進程
printf("I am the parent process, my child's PID is %d\n", pid);
wait(NULL); // 等待子進程結束
} else {
perror("fork");
return 1;
}
return 0;
}
exec()
執行另一個程序,并在新程序中獲取父進程 ID:#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) { // 子進程
printf("I am the child process, my parent's PID is %d\n", getppid());
execlp("ls", "ls", NULL); // 在子進程中執行 ls 命令
perror("execlp");
return 1;
} else if (pid > 0) { // 父進程
printf("I am the parent process, my child's PID is %d\n", pid);
wait(NULL); // 等待子進程結束
} else {
perror("fork");
return 1;
}
return 0;
}
kill()
向父進程發送信號:#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) { // 子進程
signal(SIGINT, signal_handler); // 設置子進程的信號處理器
printf("I am the child process, my parent's PID is %d\n", getppid());
while (1) {
sleep(1);
}
} else if (pid > 0) { // 父進程
printf("I am the parent process, my child's PID is %d\n", pid);
kill(pid, SIGINT); // 向子進程發送 SIGINT 信號(例如,Ctrl+C)
wait(NULL); // 等待子進程結束
} else {
perror("fork");
return 1;
}
return 0;
}
這些示例展示了如何將 getppid()
與 fork()
、exec()
和 kill()
系統調用結合使用。通過這些組合,您可以在一個進程中創建、監控和控制另一個進程。