Linux06,07,fork的使用与回顾,,解决僵死进程,文件操作

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获取退出码,子进程不会变成僵死进程。

猜你喜欢

转载自blog.csdn.net/sunshinecandy/article/details/86291195