3.7系统调用及应用

以下是用户态下模拟执行命令的一个示例程序。父进程打印控制菜单,并且接受命令,然后创建子进程,让子进程去处理任务,而父进程继续打印菜单并接受命令。

#include <stdio.h>                                                                                                                                           
#include <stdlib.h>
#include <signal.h>     
#include <sys/types.h>  
#include <sys/wait.h>   
#include <string.h>

int main(int argc, char *argv[])
{
    pid_t pid;
    char cmd;
    char *arg_psa[] = {"ps", "-a", NULL};
    char *arg_psx[] = {"ps", "-x", NULL};

    while (1) {
            printf("------------------------------------------------\n");
            printf("输入 a 执行'ps -a'命令\n");
            printf("输入 x 执行'ps -x'命令\n");
            printf("输入 q 退出\n");
            cmd = getchar();     /*接收输入命令字符*/
            getchar();

            if ((pid = fork()) < 0){//创建子进程
                    perror("fork error:");
                    return -1;
            }//进程创建成功
            if(pid == 0) {      /*子进程*/
                    switch (cmd) {
                            case 'a':
                                    execve("/bin/ps", arg_psa, NULL);
                                    break;
                            case 'x':
                                    execve("/bin/ps", arg_psx, NULL);
                                    break;
                            case 'q':
                                    break;
                            default:
                                    perror("wrong cmd:\n");
                                    break;
                    }  /*子进程到此结束*/
                    exit(0);  /*此处有意设置子进程提前结束,因为它的任务已经完成
            } else if (pid > 0) {  /*父进程*/
                    if ( cmd == 'q' )
                            break;
            }
    }  /*进进程退出循环*/
    while(waitpid(-1,NULL,WNOHANG) > 0);/*父进程等待回收子进程*/
    return 0;
}

results matching ""

    No results matching ""