在 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 指针做一些功课。

想法是:

  1. 捕获命令行参数
  2. 进行一些处理以将进程 ID 从字符串转换为数字
  3. 使用 kill 命令终止进程(记住 pid 必须是数字)

用法:

如果将输出保存为 bomb,那么 运行 就像

./炸弹pid

此处char* argv[]自动存储所有命令行参数,因此您可以输入多个pid,然后使用循环杀死所有进程。实际上,这可以替代您的 launched 数组。如果你做了一些改变,那么完全有可能做类似

的事情

./bomb pid1 pid2

参考文献:

  1. PID 输入

  2. Kill Syntax

  3. strtol

注:

我建议阅读 Stephen Prata 的 C Primer Plus(最新版本为 6),这对 C 入门者来说是一项极好的投资。