System Call
int fork()
描述:为调用它的进程的内存创建完全一样的副本
返回:(原进程)新进程的PID;(新进程)返回0
int exit(int status)
描述:使调用它的进程停止执行,并释放资源,如内存和打开的文件
传入:int状态参数:0(成功)/1(失败)
int wait(int* status)
返回:当前进程的已退出(终止)的子进程的PID;若当前进程没有子进程,立刻返回-1
描述:将子进程的退出状态赋值给传入wait的地址;如果没有已退出的子进程,则wait等待。如果当前进程没有子进程,wait立刻返回-1.如果当前进程不在意子进程的退出状态,可以给wait传入地址0
intpid=fork();if(pid>0){printf("parent: child=%d\n",pid);pid=wait((int*)0);printf("child %d is done\n",pid);}elseif(pid==0){printf("child: exiting\n");exit(0);}else{printf("fork error\n");int exec(char* file, char* argv[])
传入:两个参数:含可执行文件的文件名,字符串参数组
char*argv[3];argv[0]="echo";argv[1]="hello";argv[2]=0;exec("/bin/echo",argv);printf("exec error\n");char* sbrk(int n)
描述:将数据内存扩大n个零字节
返回:新内存的位置
文件描述符:0(标准输入),1(标准输出),2(标准报错)
int read(int fd, char* buf, int n)
描述:从文件描述符fd中读取读取至多n字节,复制进buf
返回:读取的字节数
int write(int fd, char* buf, int n)
描述:从buf中写入n字节进文件描述符fd。只有在错误发生时才会写入小于n个字节。
返回:写入的字节数
charbuf[512];intn;for(;;){n=read(0,buf,sizeofbuf);if(n==0)break;if(n<0){fprintf(2,"read error\n");exit(1);}if(write(1,buf,n)!=n){fprintf(2,"write error\n");exit(1);}}int open(char* file, int flags)
传入:第一个参数为文件名,第二个参数由一组标志组成,包括:O_RDONLY(只读)/ O_WRONLY(只写)/ O_RDWR(读写)/ O_CREATE(不存在则创建)/ O_TRUNC(截短文件至长度为0)
char*argv[2];argv[0]="cat";argv[1]=0;if(fork()==0){close(0);open("input.txt",O_RDONLY);exec("cat",argv);}int dup(int fd)
描述:复制一个已经存在的文件描述符
返回:一个新的文件描述符指向同一个底层I/O对象
fd=dup(1);write(1,"hello ",6);write(fd,"world\n",6);//写入hello world\nint pipe(int p[])
描述:创建一个新管道,将读和写的文件描述符记录在数组p内
intp[2];char*argv[2];argv[0]="wc";argv[1]=0;pipe(p);if(fork()==0){close(0);dup(p[0]);close(p[0]);close(p[1]);exec("/bin/wc",argv);}else{close(p[0]);write(p[1],"hello world\n",12);close(p[1]);}int mknod(char* file, int, int)
描述:创建一个特殊的指向设备的文件
传入:后两个参数是主设备号和次设备号
int fstat(int fd, struct stat* st)
描述:从文件描述符指向的inode(文件名和文件本身共同的底层文件)获取信息,填充至struct stat中
int link(char* file1, char* file2)
描述:创建另一个文件系统名指向与当前文件相同的inode
int unlink(char* file)
描述:从文件系统中移除一个名字
open("a",O_CREATE|O_WRONLY);link("a","b");//从a读写相当于从b读写unlink("a");//inode和文件内容可通过b访问