很荣幸,小编今天又踩坑了
子进程是如何执行的?
我先说一下我自己认为这个问题的答案,通过fork()后将父进程代码段也复制,所以相当于在父进程fork()的位置添加一个断点,子进程执行的过程,就是断点之后的过程。
那么上一个代码,大家看一下:
//代码本来是用来测试kill效果的
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<signal.h>
4 #include<unistd.h>
5
6 int main(){
7
8 pid_t pid1=0;
9 pid1=getpid();
10 printf("pid1==%d",pid1);
11
12 pid_t pid=fork();
13 if(pid==0){
14 int i=0;
15 for(i=0;i<5;i++){
16 sleep(1);
17 printf("in son process\n");
18 }
19 }else
20 {
21
22 printf("in father process\n");
23 sleep(2);
24 printf("kill sub process now\n");
25 kill(pid,SIGINT);
26
27 }
28 return 0;
29
30 }
这个代码刚开始认为结果可能是正确的,就是父子进程执行,父进程掌控子进程关闭,虽然可能子进程睡眠时间比较短,但是不至于报错。
上结果:
pid1==3455in father process
pid1==3455in son process
in son process
kill sub process now
惊了!为啥pid1会输出两次!!!
后来才想会不会是因为缓冲区没有清空,导致两个进程执行时,都会在原有的进程上打印自己的输出。
后来修改代码:
8 pid_t pid1=0;
9 pid1=getpid();
10 printf("pid1==%d\n",pid1);
此时,结果就正确了,想一想也是对的,进程会复制缓冲区,而产生进程前,缓冲区中就含有,而且没有添加\n(\n可以清空缓冲区,相当于endl),所以输出结果不太正确,导致小编还以为是子进程的执行理解有问题。
总结:输出要回车,缓冲会清空。