您的位置:首页 > 运维架构 > Linux

Linux进程学习笔记一

2014-05-23 10:41 302 查看

1. 进程函数

}进程id:pid_t  非负整型
◦延迟重用原则:赋予新进程的id不同于最近终止进程id
◦id=0,调度进程,交换进程(swapper),属于内核
◦id=1,init进程,系统BIOS时由内核调用
◦id=2,页守护进程,负责虚拟存储系统的分页操作

◦pid_t getpid( void ): 得到进程的进程id
◦pid_t getppid( void ): 得到进程的父进程id

}int main( ing argc, char *argv[] )
}C程序总是从main函数开始执行。
}当内核执行C程序时,在调用main函数前首先调用一个特殊的启动例程。启动例程从内核取得命令行参数和环境变量值
}
}启动例程从main返回后立即调用exit函数
}exit( main( argc, argv[] ))
}
}内核是程序执行的唯一方法是调用一个exec函数,进程自愿终止的唯一方法是显示或隐式地调用exit函数

1.1 Exit函数

}有三个函数用于正常终止一个程序:
◦void _exit (int  status)
◦void _Exit (int status)
◦void exit (int status)


_exit和_Exit立即进入内核。

exit则先执行一些清理处理(包括关闭标准I/O流等),然后进入内核。Exit函数总是会为I/O做清理关闭工作:为所有打开流调用fclose函数。

Main函数中,exit(0) 与 return(0) 是等价的。

2. 进程存储空间


 


}Data数据段分为初始化的数据和非初始化的数据
}Exec从程序文件中读入代码段和初始化的数据段,非初始化的数据由exec初始化为0
}存放于磁盘上的程序文件中的段为代码段和初始化数据段
}未初始化数据段不存放于磁盘上,由内核在程序开始运行前被设置成0

2.1 存储分配例程

}Void* malloc( size_t size)  :分配size个字节的空间
}Void* calloc( size_t n, size_t size) :分配n个size字节的空间
}Void* realloc( void* ptr, size_t newsize)  :重新分配空间
}Void free( void* ptr) :释放空间

Malloc分配的存储区中初始值不确定,calloc分配的空间中每一位都初始化为0

存储分配例程通常使用sbrk系统调用实现,该系统调用扩充或缩小进程的堆。

3. 环境表

}每个程序都有一个环境表。
}环境表是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址。
}全局变量environ包含了该指针数组的地址
}extern  char ** environ
}char * getenv( const char *name) :获取环境变量值
}int putenv( char* str ): 将name=value字符串放入环境表
}int setenv( char* name, char* value, int rewrite): 将环境表中name值设置为value。若环境表中name已存在,则a)若rewrite非0,则先删除现有定义; b)若rewrite为0,则不设置
}int unsetenv( char* name) : 删除环境表中name的定义



4. 父子进程

}pid_t  fork ( void ) : 创建子进程
}Fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是0,父进程的返回值是新子进程的进程id
}
}子进程获得父进程数据空间、堆和栈的副本。父子进程并不共享这些存储部分,他们共享代码段。
}由于在fork之后经常跟随者exec,所以现在的很多实现并不执行一个父进程数据段、栈、堆的完全复制,而是写时复制( copy onwrite),内核为修改区域的那段内存制作一个副本。
}Fork之后是父进程还是子进程先执行是不确定的

}父进程的所有打开文件描述符都被复制到子进程里,共享一个文件表项

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 进程