1 shell程序就是位于应用软件与系统调用之间的程序
每个用户登录系统,系统就会为用户分配shell (用户的登录的口令文件 在 /etc/passwd
2 ls filename 运行原理
敲入命令传入main函数参数
根据argv[1]创建一个指向DIR的目录文件指针,并根据argv[1]创建目录
在从该目录文件读取文件,返回一个指向struct_dirent类型的指针
从而输出文件的名称
代码如下
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char* argv[]){
DIR *dp;
struct dirent *dirp;
if(argc != 2) {
printf("usage: ls directory_name");
exit(0);
}
if((dp = opendir(argv[1]))==NULL){
printf("can't open %s", argv[1]);
exit(0);
}
else {
while((dirp=readdir(dp)) != NULL )
printf("%s ", dirp->d_name);
}
closedir(dp);
return 0;
}
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char* argv[]){
DIR *dp;
struct dirent *dirp;
if(argc != 2) {
printf("usage: ls directory_name");
exit(0);
}
if((dp = opendir(argv[1]))==NULL){
printf("can't open %s", argv[1]);
exit(0);
}
else {
while((dirp=readdir(dp)) != NULL )
printf("%s ", dirp->d_name);
}
closedir(dp);
return 0;
}
3 进程ID
getpid(), getppid()
4 fork() 创建一个进程,返回值有两个,返回给父进程的是被创建进程的PID,返回给被创建的进程为0
例子从标准输入读取命令并执行
#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void){
char buf[256];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf, 256, stdin) != 0){
if(buf[strlen(buf)-1] == ' ')
buf[strlen(buf)-1]=0;
if((pid=fork()) <0) {
printf("fork error");
}
else if(pid==0){
execlp(buf, buf, (char*)0);
exit(0);
}
if((pid=waitpid(pid, &status, 0))<0)
printf("waitpid error");
printf("%% ");
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void){
char buf[256];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf, 256, stdin) != 0){
if(buf[strlen(buf)-1] == ' ')
buf[strlen(buf)-1]=0;
if((pid=fork()) <0) {
printf("fork error");
}
else if(pid==0){
execlp(buf, buf, (char*)0);
exit(0);
}
if((pid=waitpid(pid, &status, 0))<0)
printf("waitpid error");
printf("%% ");
}
return 0;
}
调用execlp以执行从标准输入读入的命令,这就用新的程序文件替换了子进程原先执行执行的程序文件,
子进程调用execlp执行新程序文件,而父进程希望等待子进程终止,这一要求由调用watipid实现,其参数指定为要等等待进程的pid
5 线程ID 只在该线程所属的进程中有效
6 信号:是通知进程已发生某种情况的一种技术
进程处理信号的选择
1 忽略该信号
2 按系统默认方式处理
3 提供一个函数