进程控制操作相关的函数

    #include<unistd.h>
    pid_t fork(void);
    pid_t vfork(void);

创建一个新的进程,如果返回值为正数,则执行的是父进程,该值为子进程的PID,如果返回值为0,则执行的是子进程,返回-1,创建出错。
在Linux操作系统上,vfork()同fork()一样,在其他系统中,略有区别。

    int execve(const char *filename, char *const argv[], char *const envp[]);
    int execl( const char *path, const char *arg, ..., NULL);
    int execlp( const char *file, const char *arg, ..., NULL);
    int execle( const char *path, const char *arg , ...,NULL, char * const envp[]);
    int execv( const char *path, char *const argv[]);
    int execvp( const char *file, char *const argv[]);

exec系列中的系统调用都完成相同的功能(只是参数不同而已),它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,
从而形成新进程。如果exec调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新的进程,但是它的进程标识符
与调用进程相同。这就是说,exec没有建立一个与调用进程并发的新进程,而是用新进程取代了原来的进程。所以,在exec调用成功后,
没有任何数据返回,这与fork()不同。

    #include<stdlib.h>
    int system(const char *string);
    FILE *popen(const char *command, const char *type);
    int pclose(FILE *stream);

popen()函数同system()函数类似,不同的是popen()函数会调用pipe为程序创建一个标准的输入或者输出管道,不能同时创建。

    #include<sched.h>
    int __clone(int(*fn)(void *arg),void *child_stack,int flags ,void *arg);

__clone函数同fork()函数作用一样,只不过__clone提供了更多的对父子进程共享的进程资源的控制。
第一个参数为子进程要执行的函数,第二个参数为指向分配给子进程的栈指针,第三个为标志,第四个为传递给子进程函数的参数指针。
具体讲解,可参见http://blog.csdn.net/caianye/archive/2010/10/17/5947282.aspx

    #include<sys/types.h>
    #include<sys/wait.h>
    pid_t wait(int *status);
    pid_t waitpid(pid_t pid, int *status, int options);

    #define _USE_BSD
    #include <sys/types.h>
    #include <sys/resource.h>
    #include <sys/wait.h>
    pid_t wait3(int *status, int options,struct rusage *rusage)
    pid_t wait4(pid_t pid, int *status, int options,struct rusage *rusage)

wait()等待任意子进程结束,waitpid()等待由pid指向的子进程结束。遵循BSD风格的wait3()根wait4()同wait和waitpid一样。
但其还将子进程的资源使用返回到由rusage参数指针所指的结构中。


    #include <signal.h>
    struct sigaction {
        void (*sa_handler)(int);
        sigset_t sa_mask;
        int sa_flags;
        void (*sa_restorer)(void);
    }
    void (*signal(int signum, void (*handler)(int)))(int); signal()函数为信号量signum注册处理函数。
    int raise (int sig);raise()将信号量sig发送到当前进程。
    int killpg(int pgrp, int sig);将信号量sig发送给由pgrp指定的进程组中所有的进程。当pgrp为0时,发送给当前进程的进程组。
    int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);为signal更详尽的版本
    int sigprocmask(int how, const sigset_t *set,sigset_t *oldset);设置当前被阻塞的信号的掩码
    int sigpending(sigset_t *set);处于等待状态的信号
    int sigsuspend(const sigset_t *mask);sigsuspend函数可以暂时将当前阻塞信号集改变为由sigmask指定的信号集。
改变后,sigsuspend会等待,直到一个信号被交付。一旦一个信号被交付后,原先的信号集被恢复。
由于sigsuspend调用在信号交付之后总是被终止,它的返回值总是-1,errno总是EINTR。
void psignal(int sig, const char *s);列出信号描述和指定字符串
    
    #include <sys/types.h>
    #include <signal.h>
    int kill(pid_t pid, int sig);将信号sig发送给由pid指定的进程。

    #include <unistd.h>
    int pause(void);让进程暂停直到信号出现

    #include <string.h>
    char *strsignal(int sig);返回一个指向描述信号sig的字符指针。该描述字符串或许可以在sys_siglist[]数组中被直接访问。
    extern const char * const sys_siglist[];


    #include <unistd.h>
    void _exit(int status);
    #include <stdlib.h>
    void exit(int status);
    int atexit(void (*function)(void));
    int on_exit(void (*function)(int , void *), void *arg);
    void abort(void);结束当前程序
    #include <assert.h>
    void assert (int expression);
该宏计算表达式,如果为false(0)则调用abort,否则不执行。定义NDEBUG宏可以使assert失效。
在程序结束前,由atexit()或者on_exit()注册的退出处理函数都会被调用。exit()函数会调用系统_exit()函数。
atexit和on_exit函数,注册退出处理函数,前者的处理函数没有参数,没有返回值,后者有参数。两者注册成功则返回0,否则返回-1


    #include <sys/time.h>
    struct itimerval {
        struct timeval it_interval; /* next value */
        struct timeval it_value;    /* current value */
    };

    struct timeval {
        long tv_sec;/* seconds */
        long tv_usec;/* microseconds */
    };
    int getitimer(int which, struct itimerval *value);
    int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
具体介绍参见:http://general.blog.51cto.com/927298/368548

    #include <unistd.h>
    unsigned int alarm(unsigned int seconds);当seconds时间到后,发送一个SIGALRM信号
    unsigned int sleep(unsigned int seconds);
    void usleep(unsigned long usec);
sleep和usleep函数延迟进程执行至少seconds秒或者usec毫秒。实际的延迟可能会比预计的时间长一点。


    #include <unistd.h>
    int nice(int inc);为调用nice的进程的动态优先级增加inc,降低其优先级。

    #include <sys/time.h>
    #include <sys/resource.h>
    int getpriority(int which, int who);取得程序进程执行优先权
参见http://baike.baidu.com/view/1745433.htm
    int setpriority(int which, int who, int prio);
setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义
which           who 代表的意义
PRIO_PROCESS    who为进程识别码
PRIO_PGRP       who 为进程的组识别码
PRIO_USER       who为用户识别码

进程默认的优先权都为0,所以每个进程执行所占用的时间都差不多。为了使某个进程执行的时间更长一些,可以提高该进程的优先权。
参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。
返回值
    执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。
ESRCH 参数which或who 可能有错,而找不到符合的进程
EINVAL 参数which值错误。
EPERM 权限不够,无法完成设置
EACCES 一般用户无法降低优先权
可参见:http://blog.csdn.net/billpig/archive/2010/05/09/5571718.aspx

    #include <sched.h>
    int sched_get_priority_max(int policy);
    int sched_get_priority_min(int policy);
这两个函数分别返回最大的和最小的实时静态优先级的值,这个值由policy参数所表示的调度策略来使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值