1.printf函数输出
printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满足,才会输出到屏幕。
1) 缓冲区满
2)强制刷新缓冲区 fflush
3) 程序结束时
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[],char* envp[])
{
printf("hello");
//fflush(stdout);
sleep(3);
exit(0);
}
2.主函数参数
int main( int argc, char* argv[], char* envp[])
(1) argc 参数个数
(2) argv 参数内容
(3) envp 环境变量
int main(int argc,char *argv[],char* envp[])
{
printf("argc=%d\n",argc);
for(int i=0;i<argc;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
}
3.复制进程fork
3.1fork方法
*pid_t* *fork(void);*
函数返回类型 pid_t 实质是 int 类型
进程控制块PCB
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1
int main()
{
int n=0;//控制循环次数
char *s=NULL;
pid_t id=fork();
if(id==0)
{
s="child";
n=3;
}
else
{
s="parent";
n=7;
}
for(int i=0;i<n;i++)
{
printf("s=%s,pid=%d,ppid=%d\n",s,getpid(),getppid());//得到进程的pid码
sleep(1);//睡眠函数
}
exit(0);//退出进程
}
int main()
{
int n=0;//控制循环次数
char *s=NULL;
pid_t id=fork();
if(id==0)
{
s="child";
n=3;
}
else
{
s="parent";
n=7;
}
for(int i=0;i<n;i++)
{
printf("s=%s,n=%d,&n=%p\n",s,n,&n);
sleep(1);
}
exit(0);
}
3.2fork联系
下列程序输出几个“A"?
代码:
int main(int arge,char* argv[],char* envp[])
{
for(int i=0;i<2;i++)
{
fork();
printf("A\n");
}
exit(0);
}
6个A
3.3僵死进程
父进程使用wait获取子进程的pid码 解决僵死状态
子进程先结束,父进程没有调用wait获取子进程的退出码 那么子进程就变成僵死进程
解决僵死进程 父进程调用wait();
int main()
{
int n=0;//控制循环次数
char *s=NULL;
pid_t id=fork();
if(id==0)
{
s="child";
n=3;
}
else
{
n=10;
s="parent";
int val=0;
wait(&val);//如果子进程没结束 wait会堵塞
printf("val=%d\n",val);
if(WIFEXITED(val))
{
}
}
for(int i=0;i<n;i++)
{
printf("s=%s,n=%d,&n=%p\n",s,n,&n);
sleep(1);
}
exit(0);
}