代码段一:
#include "apue.h"
#include <dirent.h>
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("can't open %s", argv[1]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
exit(0);
}
make后在../lib生成libapue.a,然后
gcc ls1.c -L ../lib -lapue -I ../include/
连接库和头文件,可以模拟ls命令,
man 1 ls //查看命令都是man 1
exit()通常用0表示正常终止
代码段二:
#include "apue.h"
#define BUFFSIZE 4096
int main(void)
{
ssize_t n;
char buf[BUFFSIZE];
while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)
{
if(write(STDOUT_FILENO,buf,n)!=n)
{
err_sys("write error");
}
}
if(n<0)
{
err_sys("read error");
}
return 0;
}
gcc iotest.c -L ../lib -lapue -I ../include/
输入什么就得到什么输出
stdin,stdout,stderr是行缓冲的,回车刷新,可以使用>或>>重定向到文件
系统io是不带缓冲的,例如read,write,lseek,open,close
标准io是带缓冲的,例如fprint,fread,fwrite
代码段三:
#include "apue.h"
int
main(void)
{
int c;
while ((c = getc(stdin)) != EOF)
if (putc(c, stdout) == EOF)
err_sys("output error");
if (ferror(stdin))
err_sys("input error");
exit(0);
}
效果同上
代码段4
#include "apue.h"
int
main(void)
{
printf("hello world from process ID %ld,parent process ID %ld\n", (long)getpid(),(long)(getppid()));
exit(0);
}
运行
sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$ gcc hello.c -L ../lib/ -lapue -I ../include/
sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$ ./a.out
hello world from process ID 13135,parent process ID 22719
sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$ ps -aux |grep 22719
sun 13151 0.0 0.0 14540 1044 pts/0 S+ 19:14 0:00 grep 22719
sun 22719 0.0 0.0 22940 4760 pts/0 Ss 16:47 0:00 /bin/bash
代码段5
#include "apue.h"
#include <sys/wait.h>
int
main(void)
{
char buf[MAXLINE]; /* from apue.h */
pid_t pid;
int status;
printf("%% "); /* print prompt (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);
}
/* parent */
if ((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}
运行:
sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$ ./a.out
% date
Tue May 1 19:46:56 CST 2018
% pwd
/home/sun/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro
% abcde
couldn't execute: abcde: No such file or directory
% sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$
extern int execlp (const char *__file, const char *__arg, ...)
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名, 找到后便执行该文件, 然后将第二个以后的参数当做该文件的argv[0]、argv[1]……, 最后一个参数必须用空指针(NULL)作结束,例如
execlp("ls","ls","-al","/zhmc",(char *)0);
waitpid(pid_t pid,int* status,int option);阻塞等待进程号为pid的子线程结束,并回收进程号等资源
代码段6
#include "apue.h"
#include <errno.h>
int
main(int argc, char *argv[])
{
fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
errno = ENOENT;
perror(argv[0]);
exit(0);
}
运行
sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$ gcc testerror.c -L ../lib/ -lapue -I ../include/
sun@sun-PC:~/Downloads/linux/UNIX环境高级编程.tar/apue.3e/intro$ ./a.out
EACCES: Permission denied
./a.out: No such file or directory
int fprintf (FILE* stream, const char*format, [argument])
char* strerror(int erorno);
void perror(char*);
代码段7
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
uid_t uid=getuid();
gid_t gid=getgid();
printf("uid:%d,gid:%d\n",(int)uid,(int)gid);
return 0;
}
运行:
[root@localhost apue]# ./a.out
uid:0,gid:0
[root@localhost apue]# su sun
[sun@localhost apue]$ ./a.out
uid:500,gid:500
代码段8
#include "apue.h"
#include <sys/wait.h>
static void sig_int(int); /* our signal-catching function */
int
main(void)
{
char buf[MAXLINE]; /* from apue.h */
pid_t pid;
int status;
if (signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal error");
printf("%% "); /* print prompt (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);
}
/* parent */
if ((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}
void
sig_int(int signo)
{
printf("interrupt\n%% ");
}
其中signal()如下
#include "apue.h"
/* Reliable version of signal(), using POSIX sigaction(). */
Sigfunc *
signal(int signo, Sigfunc *func)
{
struct sigaction act, oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (signo == SIGALRM) {
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
} else {
act.sa_flags |= SA_RESTART;
}
if (sigaction(signo, &act, &oact) < 0)
return(SIG_ERR);
return(oact.sa_handler);
}
信号详说