文档章节

Linux下的C程序,使用函数execlp运行Shell命令

北风其凉
 北风其凉
发布于 2014/09/22 21:56
字数 570
阅读 4915
收藏 6

通过C程序运行Shell命令,使用execlp函数

execlp的几个参数分别为:文件名,各个参数,(char*)0

其中“各个参数”部分中的第一个参数就是文件名(相当于文件名要输入两遍)

最后一个参数写(char*)0就可以了

文件b.cpp代码:

循环地输入命令→执行命令,直到按下Ctrl+C结束

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

#define MAX_PARA_NUMS      10
#define MAX_CHAR_EACH_PARA 1000

int split(char* input, char output[MAX_PARA_NUMS][MAX_CHAR_EACH_PARA])
{
    int counter = 0;

    int len = strlen(input);
    bool bTemp = false;
    int i, j = 0;
    for(i = 0; i < len; i++)
    {
        if(input[i] == ' ')
        {
            if(j != 0 && counter > 0)
            {
                output[counter - 1][j] = '\0';
            }
            bTemp = false;
        }
        else
        {
            if(bTemp == false)
            {
                j = 0;
                counter++;
                bTemp = true;
            }

            output[counter - 1][j] = input[i];
            j++;
        }
    }    

    return counter;
}

int main()
{
    int counter = 0;
    char params[MAX_PARA_NUMS][MAX_CHAR_EACH_PARA];

    //使用g++编译文件
    //execlp("g++", "g++", "a.cpp", "-o", "a", (char*)0);
    
    char buf[4096];
    pid_t pid;
    int status;

    //输入PROMPT字符串
    printf("CONSOLE-X\n");
    printf("=========\n");
    while (fgets(buf, 4096, stdin) != NULL)
    {
        if (buf[strlen(buf) - 1] == '\n')
        {
            buf[strlen(buf) - 1] = '\0';
        }

        pid = fork();
        if (pid < 0)
        {
            printf("fork error");
        }
        else if (pid == 0)
        {
            counter = split(buf, params);
            if(counter != 0)
            {
                printf("---------\n");
            }
            switch(counter)
            {
                case 0: break;
                case 1: 
                    {
                        execlp(params[0], params[0], (char*)0);
                    }    
                    break;
                case 2:
                    {
                        execlp(params[0], params[0], params[1], (char*)0);
                    }
                    break;
                case 3:
                    {
                        execlp(params[0], params[0], params[1], params[2],
                            (char*)0);
                    }
                    break;
                case 4:
                    {
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], (char*)0);
                    }
                    break;
                case 5:
                    {
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], params[4], (char*)0);
                    }
                    break;
                case 6:
                    {
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], params[4], params[5], (char*)0);
                    }
                    break;
                case 7:
                    {    
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], params[4], params[5], params[6], (char*)0);
                    }
                    break;
                case 8:
                    {    
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], params[4], params[5], params[6],
                            params[7], (char*)0);
                    }
                    break;
                case 9:
                    {    
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], params[4], params[5], params[6],
                            params[7], params[8], (char*)0);
                    }
                    break;
                case 10:
                    {    
                        execlp(params[0], params[0], params[1], params[2], 
                            params[3], params[4], params[5], params[6],
                            params[7], params[8], params[9], (char*)0);
                    }
                    break;
                default:
                    {
                        printf("Illegal Input!\n");
                    }
                    break;
            }
        }
        else
        {
            //输入PROMPT字符串
            //printf("CONSOLE-X> ");
        }
    }

    return 0;
}

将b.cpp编译成可执行的文件b(输入命令:g++ b.cpp -o b)

然后打开文件b,依次输入命令

ls -ls
cat a.cpp
g++ a.cpp -o a
./a

文件a.cpp代码:

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    return 0;
}

运行结果示例:

END

© 著作权归作者所有

北风其凉

北风其凉

粉丝 120
博文 497
码字总数 462305
作品 4
朝阳
程序员
私信 提问
Linux环境编程--进程

查看正在运行的进程 #ps -ef #ps ax 可以看到状态 查看nice值 #ps -l #ps -f system函数 传递命令,如同在shell中执行 char * p="ps ax"; system(p); 或者 ="ps ax &";//ps一启动shell就返回......

晨曦之光
2012/03/09
85
0
Linux多任务编程(三)---exec函数族及其基础实验

exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行...

长平狐
2013/06/17
272
0
Linux执行ls,会引起哪些系统调用

从一个问题说起 Linux执行ls,会引起哪些系统调用? A. nmap B. read C. execve D. fork 答案是read、exec系列 首先我们讨论一下什么是系统调用(system calls)? 用户借助UNIX/linux直接提...

realsa
2016/06/23
475
0
使用 Python 创建你自己的 Shell (上)

(提示:你可以在这里查找本博文使用的源代码,代码以 MIT 许可证发布。在 Mac OS X 10.11.5 上,我使用 Python 2.7.10 和 3.4.3 进行了测试。它应该可以运行在其他类 Unix 环境,比如 Linu...

linuxprobe
2016/08/15
4
0
exec函数族的使用

调用shell脚本命令:execlp("sh","sh","filename",(char*)0); exec用被执行的程序完全替换调用它的程序的影像。fork创建一个新的进程就产生了一个新的PID, exec启动一个新程序,替换原有的进......

晨曦之光
2012/03/09
127
0

没有更多内容

加载失败,请刷新页面

加载更多

在docker容器中使用非root用户执行脚本 (

应用容器化之后,在docker容器启动时,默认使用的是root用户执行命令,因此容器中的应用默认都是使用root用户来运行的,存在很高的安全风险,那么如何能够使用非root的业务用户来运行应用呢,...

dragon_tech
11分钟前
2
0
那些能帮助你提升十倍开发效率的优质工具

Java世界中存在着很多工具,从著名的IDE(例如Eclipse,NetBeans和IntelliJ IDEA)到JVM profiling和监视工具(例如JConsole,VisualVM,Eclipse Memory Analyzer等)。 在本文中,我将重点介...

乱世当空
13分钟前
4
0
JavaScript面试题总结系列(二)

2. JavaScript对象 2.1 内置对象 Object是JavaScript中所有对象的父对象; 数据封装类对象:Object、Array、Boolean、Number、String; 其他对象:Function、Arguments、Math、Date、RegExp、...

张森ZS
20分钟前
2
0
Mac部署hadoop3(伪分布式)

环境信息 操作系统:macOS Mojave 10.14.6 JDK:1.8.0_211 (安装位置:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home) hadoop:3.2.1 开通ssh 在"系统偏好设置"->"共享......

程序员欣宸
20分钟前
4
0
windows下disruptor源码由gradle工程转maven工程

github上下载disruptor源码工程,版本为3.3.2。 下载gradle的1.12版本的zip包。注意高版本的gradle会编译报错的,因为在disruptor工程中build.gradle文件中显示的gradle版本为1.12。 配置win...

zjg23
24分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部