system函数(fork,execlp)

转载 2012年03月28日 10:36:43
system 函数和有同等机能的函数(mysystem)的示例。
execlp(execvp,..)函数一实行参数的命令和指定参数就将执行,但是执行后,相应程序将终止。
如果想在其执行后,仍继续进行程序处理动作,就要通过fork生成子进程,在那个子进程内执行execlp等命令。execlp函数执行结束后,即使子进程终了后,其父进程仍然能够继续执行相应处理。
execlp 函数中,用通常的shell执行pipe和Redirection处理( |  etc.)和通过正规表现(? * etc.)不能进行复杂的处理.如要进行复杂的处理,通过shell command(/bin/sh etc.)来执行. 例:
  execlp("/bin/sh","/bin/sh","-c","ls | wc > output.txt",NULL);
例如,mysystem()函数的执行例和根据mysystem()函数的执行结果(exit status)发生分歧处理的例子。
system函数(fork,execlp)(list_76.c)
#include stdio.h>
#include stdlib.h>
#include sys/types.h>
#include sys/wait.h>
int mysystem(char* cmd)
{
    int child,status;
    if ((child = fork())  0) {
        perror("fork");
        return EXIT_FAILURE;
    }
    if(child == 0){
        execlp("/bin/sh","/bin/sh","-c",cmd,NULL);
        return EXIT_FAILURE;
    } else {
        if(wait(&status)  0) {
            perror("wait");
            exit(1);
        }
    }
    return status;
}
int main(int argc,char* argv[])
{
    int status;
    char cmd[256];
    if(argc  4) {
        printf("usage: %s \"test-rule\" \"true command\" \"false command\"\n",argv[0]);
        return 0;
    }
    printf("**test of mysystem\n");
    mysystem("cat list_76.c | wc");
   
    printf("**execute shell rule\n");
    sprintf(cmd,"test %s;",argv[1]);
    status = mysystem(cmd);
    if(status) mysystem(argv[3]);
    else mysystem(argv[2]);
   
    return 0;
}


执行结果

Gami[178]% ./list_76.exe
usage: ./list_76.exe "test-rule" "true command" "false command"
Gami[179]% ./list_76.exe "-f makefile" "head makefile" "ls"
**test of mysystem
     43 90 840
**execute shell rule --> true 的执行[存在 makefile ]
SRC = list_76
OBJS = $(SRC).o
COMP = gcc
FLAG = -lm -Wall
LANG = c
all: $(OBJS)
        $(COMP) -o $(SRC) $(OBJS) $(FLAG)
        ./$(SRC)
Gami[180]% ./list_76.exe "-d folder" "head makefile" "ls -F"
**test of mysystem
     43 90 840
**execute shell rule --> false 的执行[名叫folder 的文件夹不存在]
makefile misc/ list_76.c list_76.exe* list_76.o
Gami[181]%


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/98822/showart_1992370.html
 

Linux环境编程--waitpid与fork与execlp

waitpid  waitpid(等待子进程中断或结束)  表头文件  #include  #include  定义函数 pid_t waitpid(pid_t pid,int * status,in...
  • 21aspnet
  • 21aspnet
  • 2011年09月01日 16:57
  • 5670

fork()、pipe()、dup2() 和 execlp() 的组合技法

 pipe(),父子进程之间通讯工具。pipe有读写两端,用int表搜索示。0-read, 1-write.一端进程将数据写入write内,另一进程由read段读出。使用参数为一个int数组,共...
  • victoryckl
  • victoryckl
  • 2013年12月15日 17:16
  • 1824

模拟linux的shell---顺便复习一下fork,execlp和waitpid函数

我们知道, 如果在linux的shell中执行ls, 那么实际上shell对应的进程是父进程, ls对应的进程是子进程。 我们已经模拟过ls了, 下面, 我们来模拟一下shell, 让我们模拟的she...
  • stpeace
  • stpeace
  • 2015年04月25日 20:03
  • 3786

初识Linux/C语言编程,管道和重定向暨fork与execlp函数的理解

初识Linux/C语言编程,管道和重定向暨fork与execlp函数的理解Linux中C语言的编程有两个Windows环境下根本无须考虑的问题,关于管道和重定向的概念。fork函数是让程序创建一个跟自...
  • jxxfqyy
  • jxxfqyy
  • 2009年10月22日 10:25
  • 2516

system函数和fork-exec机制

system函数 使用man system查看帮助如下: NAME        system -execute a shell command   SYNOPSIS        #include ...
  • CODINGCS
  • CODINGCS
  • 2015年08月30日 16:29
  • 813

system函数的原理和调用方法

原文地址:http://blog.sina.com.cn/s/blog_7708265a01010luz.html
  • u012751064
  • u012751064
  • 2014年09月02日 10:36
  • 2400

execlp最后一个参数必须为空

execlp中最后一个参数必须为空,第一个参数为执行的命令的文件名字,也可以通过命令来反查文件,比如是:execlp(“ls”,”ls”,”-al”,”/etc/passwd”,NULL)。 参考学...
  • chenrunhua
  • chenrunhua
  • 2012年12月17日 13:56
  • 1198

尝试编写一个shell( fork exec wait)

平台:CentOS 5.5   内核 2.6.13 #include #include #include #include #include #include int main() {...
  • linux_wgl
  • linux_wgl
  • 2012年08月05日 19:11
  • 984

进程管理:fork与exec函数及fork子进程和父进程

http://blog.csdn.net/pipisorry/article/details/25134579 exec函数族 也许有不少读者从本系列文章一推出就开始读,一直到这里还有一个...
  • pipisorry
  • pipisorry
  • 2014年05月06日 15:39
  • 1626

Linux execlp函数

execlp从PATH 环境变量中查找文件并执行定义:int execlp(const char * file,const char * arg,……);头文件:#include说明:execlp()...
  • 21aspnet
  • 21aspnet
  • 2012年05月15日 11:46
  • 17347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:system函数(fork,execlp)
举报原因:
原因补充:

(最多只允许输入30个字)