1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
| #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/prctl.h> #include <string.h> #include <errno.h> #include <getopt.h>
// 显示帮助信息 void show_help(const char *program_name) { printf("用法: %s [选项]\n", program_name); printf("\n选项:\n"); printf(" -n, --name=NAME 设置进程名称\n"); printf(" -s, --show 显示当前进程信息\n"); printf(" -d, --dumpable=0|1 设置核心转储权限\n"); printf(" -p, --pdeathsig=SIG 设置父进程死亡信号\n"); printf(" -h, --help 显示此帮助信息\n"); printf("\n示例:\n"); printf(" %s -n MyNewName # 设置进程名称\n", program_name); printf(" %s -s # 显示进程信息\n", program_name); printf(" %s -d 0 # 禁止核心转储\n", program_name); printf(" %s -p 15 # 设置父进程死亡信号为 SIGTERM\n", program_name); }
// 显示当前进程信息 void show_process_info() { char name[16]; printf("=== 当前进程信息 ===\n"); printf("进程 ID: %d\n", getpid()); printf("父进程 ID: %d\n", getppid()); printf("用户 ID: %d\n", getuid()); printf("组 ID: %d\n", getgid()); // 获取进程名称 if (prctl(PR_GET_NAME, name) == 0) { name[15] = '\0'; printf("进程名称: %s\n", name); } // 获取核心转储权限 int dumpable = -1; if (prctl(PR_GET_DUMPABLE, &dumpable) == 0) { printf("核心转储: %s\n", dumpable ? "允许" : "禁止"); } // 获取父进程死亡信号 int pdeathsig = -1; if (prctl(PR_GET_PDEATHSIG, &pdeathsig) == 0) { if (pdeathsig > 0) { printf("父进程死亡信号: %d\n", pdeathsig); } else { printf("父进程死亡信号: 无\n"); } } }
int main(int argc, char *argv[]) { char *new_name = NULL; int dumpable = -1; int pdeathsig = -1; int show_info = 0; printf("=== prctl 进程控制工具 ===\n\n"); // 解析命令行参数 static struct option long_options[] = { {"name", required_argument, 0, 'n'}, {"show", no_argument, 0, 's'}, {"dumpable", required_argument, 0, 'd'}, {"pdeathsig", required_argument, 0, 'p'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int opt; while ((opt = getopt_long(argc, argv, "n:sd:p:h", long_options, NULL)) != -1) { switch (opt) { case 'n': new_name = optarg; break; case 's': show_info = 1; break; case 'd': dumpable = atoi(optarg); break; case 'p': pdeathsig = atoi(optarg); break; case 'h': show_help(argv[0]); return 0; default: fprintf(stderr, "使用 '%s --help' 查看帮助信息\n", argv[0]); return 1; } } // 显示信息 if (show_info || (!new_name && dumpable == -1 && pdeathsig == -1)) { show_process_info(); printf("\n"); } // 设置进程名称 if (new_name) { if (prctl(PR_SET_NAME, new_name) == 0) { printf("✓ 设置进程名称为: %s\n", new_name); } else { printf("✗ 设置进程名称失败: %s\n", strerror(errno)); } } // 设置核心转储权限 if (dumpable != -1) { if (prctl(PR_SET_DUMPABLE, dumpable) == 0) { printf("✓ %s核心转储\n", dumpable ? "允许" : "禁止"); } else { printf("✗ 设置核心转储权限失败: %s\n", strerror(errno)); } } // 设置父进程死亡信号 if (pdeathsig > 0) { if (prctl(PR_SET_PDEATHSIG, pdeathsig) == 0) { printf("✓ 设置父进程死亡信号为: %d\n", pdeathsig); } else { printf("✗ 设置父进程死亡信号失败: %s\n", strerror(errno)); } } // 显示使用建议 if (new_name || dumpable != -1 || pdeathsig != -1) { printf("\n=== 使用建议 ===\n"); printf("进程名称控制:\n"); printf(" - 用于进程标识和监控\n"); printf(" - 方便系统管理工具识别\n"); printf(" - 长度限制为 15 个字符\n"); printf("\n安全控制:\n"); printf(" - 禁止核心转储保护敏感信息\n"); printf(" - 设置父进程死亡信号实现优雅退出\n"); printf(" - 提高进程的安全性和可控性\n"); } return 0; }
|