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);
}
该程序的主要限制是不能向所执行的命令传递参数