从C中的终端控制进程

时间:2016-03-20 17:19:32

标签: c parent pid kill child-process

我有一个应该杀死子进程的函数炸弹()。

void bomb(id){
    kill(id, SIGKILL);
    printf("%d is ruined!", id);
}

它应该被终端中的用户输入调用,例如"炸弹2355" (其中2355是儿童过程的pid)。怎么做?

我还坚持另一件事。如何将所有子进程PID添加到已启动的数组[10]?因此,如果命令==" 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");
}

1 个答案:

答案 0 :(得分:0)

您需要捕获并处理命令行参数,如下所示。

    #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必须是数字)
  4. <强>用法:

    如果将输出保存为炸弹,则按

    运行

    ./ bomb pid

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

    这样的事情

    ./ bomb pid1 pid2

    参考文献:

    1. PID type

    2. Kill Syntax

    3. strtol

    4. 注意:

      我建议阅读Stephen Prata的C Primer Plus(最新版本为6),这对C创客来说是一笔不错的投资。