在 C 中从终端控制进程
Control processes from terminal in C
我有一个应该终止子进程的函数 bomb()。
void bomb(id){
kill(id, SIGKILL);
printf("%d is ruined!", id);
}
它应该由用户在终端中输入来调用,例如 "bomb 2355"(其中 2355 是子进程的 pid)。怎么做?
我还被另一件事困住了。如何将所有子进程 PID 添加到 launched[10] 数组?因此,如果 command == "status"?
可以访问它
我是 C 的新手.. 在互联网上到处搜索:( 下面是完整的代码。
将不胜感激任何帮助!谢谢!
char planes();
void plane_function();
void refuel();
void bomb(int id);
void handle_signal(int signo);
char command[12];
int launched[10];
int main ()
{
planes();
return 0;
}
char planes(){
printf("Enter a command: ");
scanf("%s", command);
pid_t main_process; //main process created
//struct sigaction sa; //handling signals
//printf("My pid is: %d\n", getpid());
if (strcmp(command, "launch") == 0){
main_process = fork();
if (main_process == 0){
printf ("the main process ID is %d\n", getppid()); // main_process ID
printf ("the new plane ID is %d\n", getpid()); // child ID
//printf("launched: %d", launched[n]);
launched[0] = getpid();
plane_function(launched[0], main_process);
}
else
{
//printf("Parent");
}
}
else if (strcmp(command, ("bomb")) == 0){ // how to access a PID
printf("Bomb N\n");
bomb(plane_id);
}
else if (strcmp(command, "refuel") == 0){
printf("Refuel N\n");
}
else if (strcmp(command, "status") == 0){
printf("STATUS: \n");
printf("Planes launched: \n");
printf("%d\n ", launched[0]);
}
else if (strcmp(command, "quit") == 0){
printf("Quit\n");
}
else {
printf("Error! Wrong command!\n");
}
planes();
return 0;
}
void plane_function(id) {
int fuel = 100;
while (fuel >= 15){
sleep(3);
fuel = fuel - 15;
printf("Bomber %d to base. Fuel left: %d\n", id, fuel);
if(fuel == 10){
printf("%d, you're done kid\n", id);
kill(id, SIGKILL);
}
}
}
void bomb(id){
kill(id, SIGKILL);
printf("%d is ruined!", id);
}
void handle_signal(int signo){
const char *signal_name;
sigset_t pending;
printf("SIGNAL!!!!");
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGKILL)
printf("received SIGKILL\n");
}
您需要像下面这样捕获并处理命令行参数。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
/* This program demonstrates killing a process using a c program
*/
int main(int argc,char* argv[]) // Here the char* catches command line arguments and argc is total number of arguments
{
int pid; // for extracting the process id from the command line argument
char** end;
if (argc<2)
{
printf("Usage : bomb pid\n");
exit(1); // Exiting with 0 usually means a command ran successfully in Linux
}
else
{
pid=(int)strtol(argv[1],end,10);
kill(pid,SIGTERM);
printf("Process %d terminated\n",pid);
}
return 0;
}
如果您不了解指针 - 因为您是 C 的新手 - 您可能需要在尝试破译上述程序之前对 C 指针做一些功课。
想法是:
- 捕获命令行参数
- 进行一些处理以将进程 ID 从字符串转换为数字
- 使用 kill 命令终止进程(记住 pid 必须是数字)
用法:
如果将输出保存为 bomb,那么 运行 就像
./炸弹pid
此处char* argv[]
自动存储所有命令行参数,因此您可以输入多个pid,然后使用循环杀死所有进程。实际上,这可以替代您的 launched
数组。如果你做了一些改变,那么完全有可能做类似
的事情
./bomb pid1 pid2
参考文献:
注:
我建议阅读 Stephen Prata 的 C Primer Plus(最新版本为 6),这对 C 入门者来说是一项极好的投资。
我有一个应该终止子进程的函数 bomb()。
void bomb(id){
kill(id, SIGKILL);
printf("%d is ruined!", id);
}
它应该由用户在终端中输入来调用,例如 "bomb 2355"(其中 2355 是子进程的 pid)。怎么做?
我还被另一件事困住了。如何将所有子进程 PID 添加到 launched[10] 数组?因此,如果 command == "status"?
可以访问它我是 C 的新手.. 在互联网上到处搜索:( 下面是完整的代码。 将不胜感激任何帮助!谢谢!
char planes();
void plane_function();
void refuel();
void bomb(int id);
void handle_signal(int signo);
char command[12];
int launched[10];
int main ()
{
planes();
return 0;
}
char planes(){
printf("Enter a command: ");
scanf("%s", command);
pid_t main_process; //main process created
//struct sigaction sa; //handling signals
//printf("My pid is: %d\n", getpid());
if (strcmp(command, "launch") == 0){
main_process = fork();
if (main_process == 0){
printf ("the main process ID is %d\n", getppid()); // main_process ID
printf ("the new plane ID is %d\n", getpid()); // child ID
//printf("launched: %d", launched[n]);
launched[0] = getpid();
plane_function(launched[0], main_process);
}
else
{
//printf("Parent");
}
}
else if (strcmp(command, ("bomb")) == 0){ // how to access a PID
printf("Bomb N\n");
bomb(plane_id);
}
else if (strcmp(command, "refuel") == 0){
printf("Refuel N\n");
}
else if (strcmp(command, "status") == 0){
printf("STATUS: \n");
printf("Planes launched: \n");
printf("%d\n ", launched[0]);
}
else if (strcmp(command, "quit") == 0){
printf("Quit\n");
}
else {
printf("Error! Wrong command!\n");
}
planes();
return 0;
}
void plane_function(id) {
int fuel = 100;
while (fuel >= 15){
sleep(3);
fuel = fuel - 15;
printf("Bomber %d to base. Fuel left: %d\n", id, fuel);
if(fuel == 10){
printf("%d, you're done kid\n", id);
kill(id, SIGKILL);
}
}
}
void bomb(id){
kill(id, SIGKILL);
printf("%d is ruined!", id);
}
void handle_signal(int signo){
const char *signal_name;
sigset_t pending;
printf("SIGNAL!!!!");
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGKILL)
printf("received SIGKILL\n");
}
您需要像下面这样捕获并处理命令行参数。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
/* This program demonstrates killing a process using a c program
*/
int main(int argc,char* argv[]) // Here the char* catches command line arguments and argc is total number of arguments
{
int pid; // for extracting the process id from the command line argument
char** end;
if (argc<2)
{
printf("Usage : bomb pid\n");
exit(1); // Exiting with 0 usually means a command ran successfully in Linux
}
else
{
pid=(int)strtol(argv[1],end,10);
kill(pid,SIGTERM);
printf("Process %d terminated\n",pid);
}
return 0;
}
如果您不了解指针 - 因为您是 C 的新手 - 您可能需要在尝试破译上述程序之前对 C 指针做一些功课。
想法是:
- 捕获命令行参数
- 进行一些处理以将进程 ID 从字符串转换为数字
- 使用 kill 命令终止进程(记住 pid 必须是数字)
用法:
如果将输出保存为 bomb,那么 运行 就像
./炸弹pid
此处char* argv[]
自动存储所有命令行参数,因此您可以输入多个pid,然后使用循环杀死所有进程。实际上,这可以替代您的 launched
数组。如果你做了一些改变,那么完全有可能做类似
./bomb pid1 pid2
参考文献:
注:
我建议阅读 Stephen Prata 的 C Primer Plus(最新版本为 6),这对 C 入门者来说是一项极好的投资。