代码段一:
#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);
}
信号详说