linux c 笔记 进程控制(四)

一.更改用户 I D和组I D
可以用setuid函数设置实际用户ID和有效用户ID。与此类似,可以用 setgid函数设置实际组ID和有效组ID。
int setgid(gid_t gid) ;
两个函数返回:若成功则为 0,若出错则为- 1
关于谁能更改 ID有若干规则。现在先考虑有关改变用户 I D的规则(在这里关于用户 ID所说明的一切都适用于组 ID)。
(1) 若进程具有超级用户特权,则 setuid函数将实际用户 ID、有效用户 ID,以及保存的设置-用户- ID设置为uid。
(2) 若进程没有超级用户特权,但是 u i d等于实际用户I D或保存的设置 -用户- ID,则setuid只将有效用户I D设置为uid。不改变实际用户ID和保存的设置-用户- ID。
(3) 如果上面两个条件都不满足,则 errno设置为EPERM,并返回出错。
在这里假定 _POSIX_SAED_IDS为真。如果没有提供这种功能,则上面所说的关于保存的设置-用户- I D部分都无效。
关于内核所维护的三个用户 I D,还要注意下列几点:
(1) 只有超级用户进程可以更改实际用户 I D 。通常,实际用户 I D是在用户登录时,由login ( 1 )程序设置的,而且决不会改变它。因为 login是一个超级用户进程,当它调用 setuid时,设置所有三个用户 I D。
(2) 仅当对程序文件设置了设置-用户- I D位时, exec函数设置有效用户 I D。如果设置 -用户- I D位没有设置,则 exec函数不会改变有效用户 I D,而将其维持为原先值。任何时候都可以调用setuid,将有效用户 I D设置为实际用户 I D或保存的设置 -用户- I D。自然,不能将有效用户I D设置为任一随机值。
(3) 保存的设置-用户- I D是由exec从有效用户ID复制的。在exec按文件用户I D设置了有效用户I D后,即进行这种复制,并将此副本保存起来。


二.改变进程的优先级
可以通过设置进程的优先级来保证进程的优先运行,在linux下,通过系统调用的nice可以改变进程的优先级,nice系统调用来改变调用进程的优先级
#include <unistd.h>
int nice (int increment );
返回说明:  
   成功执行时,返回新的nice值。失败返回-1

先了解两个重要函数的用法:getpriority和setpriority

getpriority:该函数返回一组进程的优先级
#include <sys/time.h>
#include <sys/resource.h>
int getpriority(int which, int who);

出错返回-1,错误原因存于errno。
ESRCH 参数which或who 可能有错,而找不到符合的进程
EINVAL 参数which值错误。

getpriority() 的 which 参数用來指定要取得 priority 对象:process、process group 或 user ID。
which 参数:

PRIO_PROCESS:who 参数指定 process ID,传回 process 的 priority。
    PRIO_PGRP:who 参数指定 process group ID,传回 process group 的 priority。
    PRIO_USER:who参数指定 user ID,传回 user 的 priority 。

setpriority:该函数用来设置指定进程的优先级

#include<sys/time.h>
#include<sys/resource.h>
int setpriority(int which,int who, int prio);

出错返回-1,错误原因存于errno。
ESRCH 参数which或who 可能有错,而找不到符合的进程
EINVAL 参数which值错误。
EPERM 权限不够,无法完成设置
EACCES 一般用户无法降低优先权

setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义
which           who 代表的意义
PRIO_PROCESS    who为进程识别码
PRIO_PGRP       who 为进程的组识别码
PRIO_USER       who为用户识别码

nice的系统调用等价于
int nice(int increment )
{
    int oldpro = getpriority(PRIO_PROCESS ,getpid());
    return setpriority( PRIO_PROCESS ,getpid() ,oldpro + increment );
}

三:概念
1.输入/输出重定向
在Linux命令行模式中,如果命令所需的输入不是来自键盘,而是来自指定的文件,这就是输入重定向。同理,命令的输出也可以不显示在屏幕上,而是写入到指定文件中,这就是输出重定向。

输入重定向和输出重定向
# wc aa.txt
# ls > home.txt

第一条命令将文件aa.txt作为wc命令的输入,统计出aa.txt的行数、单词数和字符数。第二条命令将ls命令的输出保存在一个名为home.txt的文件中。如果>符号后边的文件已存在,那么这个文件将被重写。

2.管道
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

利用一个管道
# rpm -qa|grep licq

这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。

时间: 2024-12-28 21:40:46

linux c 笔记 进程控制(四)的相关文章

linux c 笔记 进程控制(三)

进程退出    进程结束表示进程即将结束运行,在linux系统中进程的退出方法分为正常退出和异常退出两种.exit函数进程有三种正常终止法及两种异常终止法.(1) 正常终止:    (a) 在main函数内执行return语句.这等效于调用 exit.    (b) 调用exit函数.此函数由ANSI C定义,其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登录),然后关闭所有标准I/O流等.因为ANSI C并不处理文件描述符.多进程(父.子进程)以及作业控制,所以这一定义对

linux c 笔记 进程控制(一)

1.进程简述 进程是一个动态的实体,操作系统资源分配的基本单位,每个进程都有一个非负整型的唯一进程 ID.因为进程 ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.    1)进程标识:    每个进程都有一个非负整型的唯一进程 ID.因为进程 ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.tmpnam 函数将进程 ID作为名字    的一部分创建一个唯一的路径名.    有某些专用的进程:进程 ID 0是调度进程,常常被称为交换进程 ( swapper )

linux c 笔记 进程控制(二)---守护进程

守护进程(Daemon),一说精灵进程,是指在后台运行的,没有控制终端与之相连的程序.它独立于控制终端周期性地执行某种任务或等待处理某些发生的事件.它是一个生存期较长的进程,守护进程常常在系统引导装入时启动,在系统关闭时终止.Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond.打印进程lqd等(这里的结尾字母d就是Daemon的意思).由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的

linux下的 进程控制 以及常见的进程控制函数

进程控制: 1. 进程创建函数: fork(); 头文件: #include<sys/types.h> #include<unistd.h> 函数原型: pid_t fork(void); 函数返回值:0:表示此进程现在是子进程: -1:表示出错: 子进程ID号:(大于零的整数):表示现在此进程时父进程,接收到的ID号是子进程的ID号: 2.fork()返回-1(也就是进程创建出错的原因) 1.系统中拥有了太多的进程:超过了系统的限制:(系统级) 2.该用户有了太多的进程,超过了C

linux 命令及进程控制

main.c  main.o/main.obj  main/main.exe          编译                连接 程序运行;      两步: gcc/g++  -c  main.c/main.cpp  -> main.o              gcc/g++ -o main  main.o -> main(可执行文件)     一步:  gcc -o main mian.c  -> main    工程文件:       rm  *.o     gcc  -

linux与Windows进程控制

进程管理控制 这里实现的是一个自定义timer用于统计子进程运行的时间.使用方式主要是 timer [-t seconds] command arguments 例如要统计ls的运行时间可以直接输入timer ls,其后的arguments是指所要运行的程序的参数.如:timer ls -al.如果要指定程序运行多少时间,如5秒钟,可以输入timer -t 5 ls -al.需要注意的是,该程序对输入没有做异常检测,所以要确保程序输入正确. Linux 程序思路 获取时间 时间获取函数使用get

linux c编程:进程控制(四)进程调度

当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的.进程的优先级是由nice值决定的.nice值越小,优先级越高.可以看做越友好那么调度优先级越低.进程可以通过nice函数获取更改它的nice值,进程只能影响自己的nice值,不能影响其他进程的nice值 #include <unistd.h> int nice(int incr) incr参数被增加到调用进程的nice值上,如果nice值太大,系统直接将它降到最大合法值. 可以通过nice命令来查看系统的默认nic

linux c 笔记 线程控制(二)

linux 下有两种方式可以使线程终止,一种是通过调用return 从线程函数返回,第二种是通过调用函数 #includevoidpthread_exit(void *retavl); 需要注意的地方:一是,主线程中如果从main函数返回或是调用了exit函数退出主线程,则整个进程终止,此时所有的其他线程也将终止.另一种是,如果主线程调用pthread_exit函数,则仅仅是主线程消亡,进程不会结束,其他线程也不会结束,直到所有的线程都结束时,进程才结束. 线程的分离状态决定一个线程以什么样的方

Linux内核开发 — 进程控制

本章主要是以代码的角度分析进程的定义.状态.数据结构等概念. 进程的定义 进程是一段运行的程序,他是一个动态的可执行实体.而程序是代码和数据的集合,代码是一个静态的实体,程序是可以供多个进程使用,比如相同的应用程序可以在不同的计算机上运行而产生多个进程. 进程四要素 进程四要素主要是针对代码中对线程.进程的区别而言: l  有一段程序供其执行 l  有进程专用的内核堆栈空间 l  有内核控制块(有一个task_struct 数据结构),拥有内核控制块,才能被内核调度 l  有独立的用户空间