1.复习
1.命令
1.1 .1文件:
cp rm mkdir ls more tail less cat head chmod find grep |
1.1.2进程:
ps kill jobs &
1.1.3管理
init 0 init 6 halt
1.2程序
1.2.1编译调试
gcc Makefile 管理工程 make
gdb-g
1.3库
1.3.1库是预先编译好的方法的集合
静态库libxx.a 共享库libxx.so ldd命令查看共享库
main.c gcc -o main main.c -lfoo
1.3.2库的位置:
/usr/lib lib
1.3.3头文件
/usr/include
1.3.4
命令 :/bin /usr/bin 环境变量PATH
2.fork的使用
2.1作用
fork是用来复制进程的,exec是用来替换进程的。
进程可以看做是一个正在运行的程序,状态有就绪,运行,阻塞。
pcb是进程控制块 ,其实就是一个结构体。
1#include <stdio.h>
2 #include<assert.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<stdlib.h>
6 int main()
7 {
8 int n=0;
9 char*s=NULL;
10 pid_t pid=fork();
11 assert(pid!=-1);
12
13 if(pid==0)
14 {
15 n=2;
16 s="children";//子进程
17 }
18 else
19 {
20 n=10;
21 s="parent";
22 int val =0;
23 pid_t id= wait(&val);//
24 printf("id=%d,val=%d\n",id,val);
25 }
26 int i=0;
27 for(;i<n;i++)
28 {
29 printf("s=%s,pid=%d,ppid=%d\n",s,getpid(),getppid());
30 sleep(1);
31 }
32 exit(0);
33 }
3.练习题
3.1fork的使用实现
int main()
{
int n=0;
char *s=NULL ;
pid_t pid=fork();//复制进程
if(pid==0)
{
n=5;
s="child";
}
else
{
n=7;
s="parent";
}
int i=0;
for(;i<n;i++)
{
printf("s=%s\n",s);
sleep(1);
}
}
exit(0);
3.2如下代码打印几个A
1 #include <stdio.h>
2 #include<assert.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<stdlib.h>
6 int main()
7 {
8 fork() || fork();
9 printf("A\n");
10 // printf("A");
11 exit(0);
12 }
int i=0;
for(;i<2;i++)
{
fork();
printf("A");
}
打印八个A
下面的呢
int i=0;
for(;i<2;i++)
{
fork();
printf("A\n");
}
打印六个A
总结:
printf在打印时一般将要输出的放在缓冲区中,待缓冲区满后一次输出,遇到特定的字符时强制刷新如fflush,“\n”,程序结束时也刷新。
3.3如下代码打印几个A
1 #include <stdio.h>
2 #include<assert.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<stdlib.h>
6 int main()
7 {
8 int i=0;
9 for(;i<2;i++)
10 {
11 fork();
12 //printf("A\n");
13 printf("A");
14 }
15 exit(0);
16 }
fork() || fork();
printf("A\n");
打印三个A
fork() || fork();
printf("A");
打印三个A
4.文件操作
4.1文件的读和写
1 #include <stdio.h>
2 #include<assert.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<stdlib.h>
6 #include<fcntl.h>
8 int main()
9 {
10 /*int fd=open("a.txt",O_WRONLY|O_CREAT,0600);
11 assert(fd!=-1);
12 write(fd,"hello",5);
13
14 close(fd);
15 int fd=open("a.txt",O_RDONLY);
16 assert(fd!=-1);
17
18 char buff[128]={0};
19 int n=read(fd,buff,127);
20 printf("buff=%s,n=%d\n",buff,n);
21
22 close(fd);*/
23 int fdr= open("/home/yhx/1524824520840.jpg",O_RDONLY);
24 assert(fdr!=-1);
25
26 int fdw=open("/home/yhx/a.jpg",O_WRONLY|O_CREAT,0600);
27 assert(fdw!=-1);
28
29 char buff[512]={0};
30 int n=0;
31 while((n=read(fdr,buff,512))>0)
32 {
33 write(fdw,buff,n);
34 }
35 close(fdr);
36 close(fdw);
37 exit(0);
38 }
4.2文件描述
5.僵死进程以及解决僵死进程
5.1定义:
子进程先于父进程结束,父进程没有调用wait获取子进程的退出码。
5.2解决
父进程调用wait();
父进程如果结束,int会成为子进程的父进程,然后init调用wait获取退出码,子进程不会变成僵死进程。