您的位置:首页 > 编程语言

从标准输入读入命令并执行【UNIX 环境高 3ff0 级编程】

2012-10-28 20:52 453 查看
main.c

#include "apue.h"
#include <sys/wait.h>

int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;

printf("%%");//printf requires %% to print %
while(fgets(buf,MAXLINE,stdin) != NULL){
if (buf[strlen(buf)-1] == '\n'){
buf[strlen(buf)-1] = 0;//replace newline with null
}

if ((pid = fork()) < 0){
err_sys("fork error");
}else if (pid == 0){ //child
execlp(buf, buf, (char *)0);
err_ret("couldn't execute: %s",buf);
exit(127);
}

if ((pid = waitpid(pid, &status, 0)) < 0){
err_sys("waitpid error");
}

printf("%%");
}
exit(0);
}
apue.h

#ifndef _APUE_H
#define _APUE_H
#include <unistd.h>
#include <stdio.h>

#define MAXLINE 4096

void err_sys(const char *,...);
void err_ret(const char*,...);
#endif
apue.c

#include "apue.h"
#include <errno.h>
#include <stdarg.h>
static void err_doit(int,int,const char*,va_list);

void err_ret(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
err_doit(1,errno,fmt,ap);
va_end(ap);
exit(1);
}

void err_sys(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
err_doit(1,errno,fmt,ap);
va_end(ap);
exit(1);
}

void err_quit(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
err_doit(0,0,fmt,ap);
va_end(ap);
exit(1);
}

static void err_doit(int errnoflag, int error, const char *fmt,va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);
if (errnoflag){
snprintf(buf + strlen(buf), MAXLINE-strlen(buf), ": %s",strerror(error));
}

strcat(buf, "\n");
fflush(stdout);
fputs(buf,stderr);
fflush(NULL);
}
该程序的主要限制是不能向所执行的命令传递参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: