printf 先放到缓冲区;
缓冲区进行屏幕投影
三种缓冲区刷新方式
人为刷新
强制刷新\n
结束刷新\结束刷新
exit刷新缓冲区 _exit结束进程
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[],char *envp[] )
{
int i;
for(i=0;i<argc;i++)
{
printf("%s",argv[i]);
}
for(i=0;envp[i]!=NULL;i++)
{
printf("%s",envp[i]);
}
exit(0);
}
~
~
~
fork 并发运行 运行两个相同的的程序
不能用两个相同程序的进程进行比叫地址
(地址只是偏移地址而已)所以查看ip地址相同(逻辑不同属于不同的段)
系统的控制
int i;
char *s;
int n=0;
pid_t pid=fork();程序就绪状态时才会去fork创建进程控制块 从当前位置开始复制前一段信息进行并创建新的一个进程(连同缓冲区一块复制包括堆区的内容)
assert(pid!=-1);
if(pid == 0)
{
n=3;
s="child";
}
else
{
n=7;
s="parent";
}
for(i=0;i<n;i++)
{
printf("%d,%s\n",getpid(),s);
sleep(1);
}
exit(0);
}
子进程和父进程的s逻辑地址相同物理地址不同
先复制pcd 然后将进程实体复制进行
clude <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
int main(int argc,char *argv[],char *envp[] )
{
fork()||fork(); //首先执行第一个fork 父进程返回的个大于0的数所以直接输出A子进程返回的是0进入第二个fork 因为当前第一个子进程调用fork时为父进程,所以为真输入A ,子进程的子进程判断为假也输出‘a’总共就有3个A 所以查看id时会出现三组不同的id
printf("A\n");
exit(0);
}‘A’‘A’'A'
[wang@localhost Desktop]$ vi b.c
[wang@localhost Desktop]$ gcc b.c -o b
[wang@localhost Desktop]$ ./b
6771
A
[wang@localhost Desktop]$ 6772
A
6773
A
int main(int argc,char *argv[],char *envp[])
{
printf('A');复制缓冲区
fork();
}'A''A'
int main(int argc,char *argv[],char *envp[])
{
printf('A\n');
fork();
}
'A'
fork 复制进程
通过pcb复制 pcd 通过链表连接 新的进程 复制出来的叫子进程 并发运行 (段页式 分页式)
写时拷贝(整体拷贝进去
(逻辑页号也需要整体在进程中复制)(为了提高fork的运行速度,先复制需要的修改的页然后进行未修改的逻辑页直接对应原来问价呢物理页)*****************************************linux的内核设计
僵死进程 状态为僵死状态
子进程提前父进程结束了被释放 但pcd 没有释放 子进程结束时会返回一个退出码会放在pcd中等待父进程的访问;若父进程没有调用wait访问子进程的状态信息则出现僵尸进程(设计结构)当父进程结束时 子进程由init n=1 pid=1接管当做其父进程
子进程后结束(父进程)直接由init n=1接管;处理;
如果父进程一直在进行kill无法结束一个僵尸进程因为僵尸进程已经结束;
getppid();当前父进程的id号
解决僵死进程的放法;
退出码存储在最高的字节位置(int);
wait等待子进程的退出码;会让父进程进入阻塞状态等待子进程的退出吗
wait函数会返回当前的pid号;(处理阻塞方法fork两次)
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
char *s;
int n=0;
pid_t pid=fork();
if(pid==0)
{
pid_t pid=fork();
if(pid==0)
{
n=2;
s="child";
}
else
{
exit(0);
}
}
else
{
n=7;
s="parent";
int val;
pid_t pid=wait(&val);
printf("%d,%d\n",pid,val);
}
int i=0;
for(;i<n;i++)
{
printf("s=%s,pid=%d,ppid=%d\n",s,getpid(),getppid());
sleep(1);
}
exit(0);
}
exec 替换程序(pcd保留为原来的程序的一些属性一些属性被修改)
***********************************************************************************
参数不定,
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
printf(" pid =%d\n",getpid());
execl("./test","test","hello","123",(char*)0);
perror("execl erro\n");
printf("test over\n");
exit(0);
}
test 文件
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
6 int main(int argc,char *argv[])
7 {
8 printf("pid=%d\n",getpid());
9 int i=0;
10 for(;i<argc;i++)
11 {
12 printf("argv[%d]=%s\n",i,argv[i]);
13 }
14 exit(0);
15 }
新的进程产生
fork父进程然后exec替换产生新进程;让父进程管理子进程(这样写可以让子进程执行和父进程不一样的程序) (例子如下 main1 函数是test函数的子函数,test函数是新创建的进程)
execl
1 #include <unistd.h>
2 #include <assert.h>
3 #include <stdio.h>
4 #include <fcntl.h>
5 #include <stdlib.h>
6 int main()
7 {
8 printf(" pid =%d\n",getpid());
9 pid_t pid=fork();
10 if(pid==0)
11 {
12 execl("./test","test","hello","123",(char*)0);
13 perror("execl erro\n");
14 printf("test over\n");
15 exit(0);
16 }
17 wait(NULL);
18 exit(0);
19 }
execlp(专门去bin和usr/bin文件中查找)
用于替换命令
***************************************************************************************
1 #include <unistd.h>
2 #include <assert.h>
3 #include <stdio.h>
4 #include <fcntl.h>
5 #include <stdlib.h>
6 int main()
7 {
8 printf(" pid =%d\n",getpid());
9 pid_t pid=fork();
10 if(pid==0)
11 {
12 execlp("pss","-ef",(char*)0);
13 perror("execl erro\n");(可以打印出错的原因)
14 printf("test over\n");
15 exit(0);
16 }
17 wait(NULL);
18 exit(0);
19 }
execv 可以进行多个参数的输入放在数组里;方便写入(参数一定)只有两个 其他放在数组中(修改方便)
fork函数的使用
最新推荐文章于 2023-09-19 22:00:22 发布