Chinaunix首页 | 论坛 | 博客
  • 博客访问: 74287
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-29 14:47
文章存档

2014年(13)

2013年(15)

我的朋友

分类: C/C++

2013-12-04 17:26:36

进程ID 0是调度进程,有称为交换进程(swapper)
进程ID 1是init进程
进程ID 2是页精灵进程 都是内核进程
#include
#include
pid_t getpid(void);   返回:调用进程的进程ID
pid_t getppid(void);  返回:调用进程的父进程ID
uid_t getuid(void);   返回:调用进程的实际用户ID
uid_t geteuid(void);  返回:调用进程的有效用户ID
gid_t getgid(void);   返回:调用进程的实际组ID
gid_t getegid(void);  返回:调用进程的有效组ID
---------------------------------------------------
pid_t fork(void); 返回:子进程中为0,父进程中为子进程ID,出错为-1
由fork创建的新进程被称为子进程。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得所有子进程的进程ID。fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID 0总是由交换机进程使用,所以一个子进程的进程ID不可能为0)。
子进程和父进程继续执行fork之后的指令。子进程是父进程的复制品。例如,子进程获得父进程数据空间,堆和栈的复制品。注意,这是子进程所拥有的拷贝。父,子进程并不共享这些存储空间部分。如果正文段是只读的,则父,子进程共享正文段。
int glob=6;
char buf[]="a write to stdout\n";
int main(void)
{
  int var;
  pid_t pid;

  var=88;
  if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
    perror("write error");
  printf("before fork\n");

  if((pid=fork())<0)//同时执行,产生的子进程和父进程互不影响
    perror("fork error");
  else if(pid==0){
    glob++;
    var++;
    printf("child fork\n");
  }else
  {
     sleep(2);
     printf("parent fork\n");
  }

  printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);
  exit(0);

}
结果:a.out > temp.out
a write to stdout
before fork
child fork
pid=3191,glob=7,var=89
parent fork
pid=3190,glob=6,var=88
加偏移量之后 cat temp.out
a write to stdout
before fork
child fork ???为什么子进程printf没有再次执行呢
pid=3165,glob=7,var=89
before fork
parent fork
pid=3164,glob=6,var=88
当以交付式运行该程序时,只得到printf输出的行一次,其原因是标准输出缓存由新行符刷新。但是
当将标准输出重新定向到一个文件时,却得到printf输出行两次。其原因是,在fork之前调用了printf一次,但当调用fork时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父,子进程各自有了带该行内容的缓存。在exit之前的第二个printf将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。

阅读(1011) | 评论(0) | 转发(0) |
0

上一篇:access和umask函数

下一篇:递归问题思考

给主人留下些什么吧!~~