CH1-1 实现简易ls功能
#include
#include
int main(int argc, char * argv[])
{
DIR * dp;
struct dirent * dirp;
if(argc != 2)
err_quit("usage:ls directory_name");
if((dp = opendir(argv[1])) == NULL)
err_sys("cannot open %s", argv[1]);
while((dirp = readdir(dp)) != NULL)
{
printf("%s\n", dirp->d_name);
}
closedir(dp);
return 0;
}
CH1-2 有缓冲将stdin复制到stdout
#include
#define BUFFSIZE 4096
int main(void)
{
int n;
char buf[BUFFSIZE];
while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
{
if(write(STDOUT_FILENO, buf, n) != n)
err_sys("write error!\n");
}
if(n < 0)
err_sys("read error!\n");
return 0;
}
~
~
CH1-3 无缓冲将stdin复制到stdout
#include
int main(void)
{
int n;
while((n = getc(stdin)) != EOF)
{
if(putc(n, stdout) == EOF)
err_sys("output error!\n");
}
if(ferror(stdin))
err_sys("input error!\n");
return 0;
}
CH1-4 打印进程ID
#include
int main(void)
{
printf("%d",getpid());
return 0;
}
CH1-5 stdin读入命令并执行
#include
#include
int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf, MAXLINE, stdin) != NULL)
{
if(buf[strlen(buf)-1] == '\n')
buf[strlen(buf)-1] = 0;
if((pid = fork()) < 0)
{
err_sys("fork error!\n");
}
else if(pid == 0)
{
execlp(buf, buf, (char *)0);
err_ret("cannot execute: %s\n", buf);
exit(127);
}
if((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error!\n");
printf("%% ");
}
exit(0);
}
CH1-6 出错函数的使用方法
#include
#include
int main(int argc, char * argv[])
{
fprintf(stderr,"EACCES: %s\n", strerror(EACCES));//打印出错信息EACCES到stderr
errno = ENOENT; //出错信息:找不到文件
perror(argv[0]);//基于errno当前值,产生标准出错信息 “argv[0]字符串: error的出错信息\n”
exit(0);
}
CH1-7 打印用户ID和组ID
#include
int main(void)
{
printf("uid=%d,gid=%d\n",getuid(),getgid());
exit(0);
}
~
~
~
~
CH1-8 信号signal函数使用方法
#include
#include
static void sig_int(int);
int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;
if(signal(SIGINT, sig_int)==SIG_ERR) //当接收到SIGINT信号时,执行sig_int函数。
err_sys("signal error!\n");
printf("%% ");
while(fgets(buf,MAXLINE,stdin)!=NULL)
{
if(buf[strlen(buf)-1]=='\n')
buf[strlen(buf)-1] = 0;
if((pid = fork())<0)
{
err_sys("fork error!\n");
}
else if(pid == 0) //child
{
execlp(buf, buf, (char *)0);
err_ret("cannot execute: %s", buf);
exit(127); //子进程返回
}
if((pid = waitpid(pid,&status,0))<0) //父进程等待子进程返回
err_sys("waitpid error!\n");
printf("%% ");
}
exit(0);
}
void sig_int(int signo)
{
printf("interrupt 0\n%% ");
}