Linux是一个开放性操作系统,具有一个丰富的进程句柄管理功能来控制应用程序如何运行。这些句柄统一管理,可以帮助用户更好地控制和操纵分配给应用程序的资源。其中包括磁盘空间、机器时间和网络连接等。
Linux的进程句柄主要位于/proc目录的/pid的子目录之中,每一个进程都有唯一的句柄,此句柄定义了该进程的属性和行为。比如,当进程创建时,句柄会指定该进程的用户ID内存空间、
服务器
ID以及文件系统限制等。
Linux系统为进程句柄管理提供多种系统调用,其中包括getpid()系统调用,它可以获得当前进程的进程号;setuid()系统调用,它将当前进程的句柄用户ID设置到指定的级别;chRoot()系统调用也可以用来改变当前进程句柄的根目录。
另外,管理Linux进程句柄还可以通过使用一些命令行工具,比如ps,这是一个标准的Linux系统命令,可以用来查看当前系统中运行的所有进程;top也是一个流行的进程查看工具,可以显示系统中运行的所有进程的状态;kill和nice等命令也可以用来管理运行的进程句柄。
总而言之,Linux进程句柄管理可以帮助用户更好地控制和操纵资源,是Linux系统调度进程和资源分配的重要基础。其新功能的添加及优化以及服务的定制,可以进一步帮助Linux系统实现高效率运行。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
关于linux编程中fork和pipe的问题
fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括: —全局和局部变量 —打开的文件句柄 —共享内存、消息等同步对象由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如:假设pipe产生的句柄为P[0],P[1],在fork后父子进程都拥有了P[0],P[1]句柄,那么: —父进程可向自己的P[1]中写入数据,子进程从P[0]中即可读出该数据;切记此时父进程不能也从P[0]读数据,否则自己写入的数据可能先被自己读走了 —反之亦然,子进程向P[1]中写入数据后,父进程从P[0]中可读出该数据;切记此时子进程不要从P[0]读走数据你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,socket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。 在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P[0]和P[1]都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。
请解释以下名词并说明他们的关系:句柄、进程、线程
所谓句柄实际上是一个数据,是一个Long (整长型)的数据。 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。 WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。 从数据类型上来看它只是一个16位的无符号整数。 应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。 如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。 我们知道,所谓指针是一种内存地址。 应用程序启动后,组成这个程序的各对象是住留在内存的。 如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。 但是,如果您真的这样认为,那么您就大错特错了。 我们知道,Windows是一个以虚拟内存为基础的操作系统。 在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。 对象被移动意味着它的地址变化了。 如果地址总是如此变化,我们该到哪里去找该对象呢? 为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。 Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。 这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。 这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象 本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。 但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。 假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。 线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。 在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。 由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点。 线程,也被称为轻量进程(lightweight processes)。 计算机科学术语,指运行中的程序的调度单位。 线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。 线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。 线程可以创建和撤消线程,从而实现程序的并发执行。 一般,线程具有就绪、阻塞和运行三种基本状态。 在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。 大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度(affinity)。 进程是程序在一个数据集合上运行的过程(注:一个程序有可能同时属于 多个进程),它是操作系统进行资源分配和调度的一个独立单位,进程可以简单的分为系统进程(包括一般 Windows程序和服务进程)和用户进程
linux 编程问题 在主进程中创建2个子进程,一个用exec函数,一个用fork
编写一段程序,使用系统调用fork( )创建两个子进程。 当此程序运行时,在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。 试观察记录屏幕上的显示结果,并分析原因。 〈程序〉 #include main() { int p1,p2; if(p1=fork()) /*子进程创建成功*/ putchar(b); else { if(p2=fork()) /*子进程创建成功*/ putchar(c); else putchar(a); /*父进程执行*/ } } bca(有时会出现abc的任意的排列) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 编制一段程序,实现进程的管道通信。 使用系统调用pipe()建立一条管道线。 两个子进程p1和p2分别向通道个写一句话: child1 process is sending message! child2 process is sending message! 而父进程则从管道中读出来自两个进程的信息,显示在屏幕上。 〈程序〉 #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) { lockf(fd[1],1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入数组outpipe中*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); /*同步*/ read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf(%s\n,inpipe); wait(0); read(fd[0],inpipe,50); printf(%s\n,inpipe); exit(0); } } } 〈运行结果〉延迟5秒后显示: child1 process is sending message! 再延迟5秒: child2 process is sending message! 附:我承认我是复制的 不过很符合题意~
发表评论