系统调用:
文件描述符 open read write close
标准输入 0 stdin FILE*
标准输出 1 stdout
标准错误输出 2 stderr
struct file :
r,w,count,偏移量,pos,inode
exec 替换 进程
execl execlp execle execv execvp execve
库函数 系统调用
bash 命令解释器 fork + exec()
mybash 命令解释器
复制+替换 多用户系统
新进程 通过 fork+exec 实现
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char* argv[],char* envp)
{
char* myargv[10] = {"ps","-f"};
printf("main run pid = %d\n",getpid());
// execl("/usr/bin/ps","ps","-f",(char*)0); //执行成功不返回
// execlp("ps","ps","-f",(char*)0);
// execle("/usr/bin/ps","ps","-f",(char*)0,envp);
// execv("/usr/bin/ps",myargv); //参数放入数组
// execvp("ps",myargv);
execve("/usr/bin/ps",myargv,envp); //系统调用内核中 内部最终形式
printf("execl error"); //exec执行成功不返回 能运行到这步代表替换失败
exit(0);
}
信号:通知进程产生了某种事件
系统调用 发送信号 kill() => 进程 => signal() 1 默认 2 忽略 3 自定义
收到信号(捕获) 响应(处理)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
void fun_sig(int sig) //信号处理函数
{
printf("sig = %d\n",sig); //sig=2 收到信号 打印信号代号
//signal(sig,SIG_DFL); //(3)自定义 收到该信号第一次打印信号代号 第二次恢复默认
}
int main(int argc,char* argv[],char* envp)
{
signal(SIGINT,fun_sig); //(1)发送信号告诉内核 当该程序收到sig=2信号(ctrl+c) 调用fun_sig函数 收到信号才执行
//signal(SIGINT,SIG_IGN); //(2)忽略该信号
while(1) //该程序一直循环无法退出
{
printf("hello\n");
sleep(1);
}
}
给进程发送信号
// ./mykill pid sig
int main(int argc,char* argv[])
{
if(argc != 3)
{
printf("ard err\n");
exit(0);
}
int pid = 0;
int sig = 0;
sscanf(argv[1],"%d",&pid);
sscanf(argv[2],"%d",&sig);
if(kill(pid,sig) == -1)
{
perror("kill err");
}
exit(0);
}
父子进程 子进程结束 会给父进程发送信号 SIGCHLD
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <assert.h>
#include <sys/wait.h>
void fun_sig(int sig)
{
printf("sig = %d\n",sig); //收到信号子进程结束 子进程将变为僵死进程
int val = 0;
wait(&val); //处理子进程 使其不变为僵死进程
}
int main()
{
signal(SIGCHLD,fun_sig); // (1)在信号处理函数中调用wait
// signal(SIGCHLD,SIG_IGN); // (2)忽略子进程 只有Linux系统可以
pid_t pid = fork();
assert(pid != -1);
if (pid == 0)
{
sleep(3);
exit(0);
}
for(int i = 0 ; i < 5 ; i++)
{
printf("main run\n");
sleep(1);
}
}