[Linux]Linux_process_thread_function

本文详细介绍了进程相关的系统调用函数,如fork、exec系列、exit/_exit以及wait/waitpid等,还涵盖了进程通信的无名管道、有名管道和信号通信的相关函数。同时,文章讨论了线程使用的pthread_create、pthread_join等线程库函数以及线程同步和互斥的机制。
摘要由CSDN通过智能技术生成

1 进程相关的系统调用提供的函数

1.1

fork函数

  • pid_t fork(void)

  • 函数功能:在当前进程下(当前进程是父进程),创建一个子进程

  • 需要的头文件:

    #include <sys/types.h>

    #include <unistd.h>

  • 函数名:fork

  • 函数参数:void

  • 函数返回值:

    0:表示子进程

    大于0的整数(子进程的pid):表示父进程

    -1:出错

exec函数族

  • l:list 以列表方式传参,最后以NULL结束
  • v:vector以数组的方式传参,数组的最后一个元素为NULL
  • e:env 环境变量,传参方式同数组
  • p:PATH,在PATH所指的路径中去找可执行程序
execl函数
  • int execl(const char *path, const char *arg, …)

  • 函数功能:用path路径下的进程替换当前进程

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:execl

  • 函数参数:

    path:带路径的可执行文件名

    arg:执行可执行文件需要的指令

    …:以列表形式传参,以NULL结束

  • 函数返回值:

    成功:不会产生返回值

    出错:-1

execle函数
  • int execle(const char *path, const char *arg, …, char *const envp[])

  • 函数功能:用path路径下的进程替换当前进程

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:execle

  • 函数参数:

    path:带路径的可执行文件名

    arg:执行可执行文件需要的指令

    …:以列表形式传参,以NULL结束

    envp:预先定义的存放自定义的环境变量的数组,以NULL结束

  • 函数返回值:

    成功:不会产生返回值

    出错:-1

execlp函数
  • int execlp(const char *file, const char *arg, …)

  • 函数功能:使用环境变量下的可执行文件替换当前进程

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:execlp

  • 函数参数:

    file:环境变量下的可执行文件名,不用加路径

    arg:执行可执行文件需要的指令

    …:以列表形式传参,以NULL结束

  • 函数返回值:

    成功:不会产生返回值

    出错:-1

execv函数
  • int execv(const char *path, char *const argv[])

  • 函数功能:用path路径下的进程替换当前进程

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:execv

  • 函数参数:

    path:带路径的可执行文件名

    argv:预先定义的执行可执行文件需要的指令的数组,以NULL结束

  • 函数返回值:

    成功:不会产生返回值

    出错:-1

execve函数
  • int execve(const char *path, char *const argv[], char *const envp[])

  • 函数功能:用path路径下的进程替换当前进程

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:execve

  • 函数参数:

    path:带路径的可执行文件名

    argv:预先定义的执行可执行文件需要的指令的数组,以NULL结束

    envp:预先定义的存放自定义的环境变量的数组,以NULL结束

  • 函数返回值:

    成功:不会产生返回值

    出错:-1

execvp函数

  • int execvp(const char *file, char *const argv[])

  • 函数功能:使用环境变量下的可执行文件替换当前进程

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:execvp

  • 函数参数:

    file:环境变量下的可执行文件名,不用加路径

    argv:预先定义的执行可执行文件需要的指令的数组,以NULL结束

  • 函数返回值:

    成功:不会产生返回值

    出错:-1

exit/_exit函数

exit函数
  • void exit(int status)

  • 函数功能:退出当前进程并刷新IO缓存区

  • 需要的头文件:

    #include <stdlib.h>

  • 函数名:exit

  • 函数参数:

    status:0表示正常结束;其他数值表示非正常结束

  • 函数返回值:void

_exit函数
  • void _exit(int status)

  • 函数功能:退出当前进程,不刷新IO缓存

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:_exit

  • 函数参数:

    status:0表示正常结束;其他数值表示非正常结束

  • 函数返回值:void

wait/waitpid函数

wait函数
  • pid_t wait(int *status)

  • 函数功能:等待任意子进程的退出状态(第一个退出的子进程)

  • 需要的头文件:
    #include <sys/types.h>
    #include <sys/wait.h>

  • 函数名:wait

  • 函数参数:

    status:指向子进程退出状态值的指针

  • 函数返回值:

    成功:返回等到的子进程的PID
    失败:返回-1

waitpid函数
  • pid_t waitpid(pid_t pid, int *status, int options)

  • 函数功能:等待指定子进程的退出状态

  • 需要的头文件:

    #include <sys/types.h>
    #include <sys/wait.h>

  • 函数名:waitpid

  • 函数参数:

    pid:子进程的PID;

    status:指向子进程退出状态值的指针

    options:模式选择

    ​ 0:将waitpid函数变成阻塞函数,若本次调用没有等到结果,则阻塞当前进程;若等到结果,则返回子进程的PID。
    ​ WNOHANG:将waitpid函数变成非阻塞函数,若本次调用没有等到子进程则退出,waitpid返回0;若等到结果,waitpid返 回子进程的pid。

  • 函数返回值:

    >0:已经结束运行的子进程的进程号

    0:使用选项WNOHANG且子进程没有退出

    -1:出错

1.2 进程通信相关函数

1.2.1 无名管道相关函数

pipe函数
  • int pipe(int fd[2])

  • 函数功能:创建无名管道

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:pipe

  • 函数参数:

    fd:读写操纵数组。(fd[0]:操作管道固定的读端;fd[1]:操作管道固定的写端)

  • 函数返回值:

    0:创建无名管道成功

    -1:创建无名管道失败

1.2.2 有名管道相关函数

mkfifo函数
  • int mkfifo(const char *filename,mode_t mode)

  • 函数功能:创建有名管道

  • 需要的头文件:
    #include <sys/types.h>
    #include <sys/stat.h>

  • 函数名:mkfifo

  • 函数参数:

    filename:有名管道文件的名称,通常为字符串形式

    mode:文件权限(参见文件IO中的文件权限介绍)

  • 函数返回值:

    0:创建有名管道成功

    -1:创建有名管道失败

fgets函数
  • char *fgets(char *s, int size, FILE *stream)

  • 函数功能:从文件流指针获取字符串

  • 需要的头文件:
    #include <stdio.h>

  • 函数名:fgets

  • 函数参数:

    s:存储字符的内存首地址

    size:获取字符的的数量

    stream:文件流指针

  • 函数返回值:

    s:获取成功返回存储字符的内存首地址

    NULL:当发生错误或者没有字符可获取时返回NULL

1.2.3 信号通信相关函数

kill函数
  • int kill(pid_t pid, int sig)

  • 函数功能:给进程或进程组发送信号

  • 需要的头文件:

    #include <sys/types.h>

    #include <signal.h>

  • 函数名:kill

  • 函数参数:

    pid:

    1. 正数:发送信号给进程号为pid的进程
    2. 0:信号被发送到所有和当前进程在同一个进程组的进程
    3. -1:信号发给所有的进程表中的进程(除了进程号最大的进程外)
    4. <-1:信号发送给进程组号为-pid的每一个进程

    sig:信号类型

  • 函数返回值:

    0:发送成功

    -1:发送出错

raise函数
  • int raise(int sig)

  • 函数功能:让进程向自身发送信号

  • 需要的头文件:

    #include <sys/types.h>

    #include <signal.h>

  • 函数名:raise

  • 函数参数:

    sig:信号类型

  • 函数返回值:

    0:发送成功

    -1:发送出错

alarm函数
  • unsigned int alarm(unsigned int seconds)

  • 函数功能:该函数是一个闹铃函数,它可以在进程中设置一个定时器,当定时时间到时,内核就向当前进程发送SIGALRM(终止当前进程)信号。(默认动作可修改)

  • 需要的头文件:
    #include <unistd.h>

  • 函数名:alarm

  • 函数参数:

    seconds:秒数

  • 函数返回值:

    0:若参数为0,则返回值为0;若该定时器前没有其他定时器,则返回值也为0

    大于0的整数:若该定时器前还有别的定时器,返回值是上一个定时器被打断计时后剩余的秒数(若有两个定时器,在没有sleep函数打断的情况下,后一个定时器会把第一个定时器打断,定时时间由第二个定时器的秒数决定,此时被打断的定时器返回值为0,第二个定时器的返回值是第一个定时器被打断计时后剩余的秒数)

注意:最好不要混用sleep或者alarm函数,因为sleep()函数的实现也用到了SIGALRM信号。

pause函数
  • int pause(void)

  • 函数功能:挂起当前进程,并等待一个信号的到来,可以捕获信号

  • 需要的头文件:

    #include <unistd.h>

  • 函数名:pause

  • 函数参数:

    void

  • 函数返回值:

    -1:pause函数只有等到一个信号的到来才会返回,并且返回值始终为-1,若未等到信号的到来,阻塞

signal函数
  • sighandler_t signal(int signum, sighandler_t handler)

  • 函数功能:修改信号对应的默认处理动作,signum会自动给handler传送信号编号

  • 需要的头文件:

    #include <signal.h>

  • 函数名:signal

  • 函数参数:

    signum:信号代码,它可以取除了SIGKILL和SIGSTOP外的任何一种信号

    handler:

    typedef void (*sighandler_t)(int):入参int,返回值void

      	1. 信号对应的新的处理动作函数	
      	1. SIG_IGN:忽略该信号,使该信号失效
      	1. SIG_DFL:恢复对信号的系统默认处理,使该信号保持系统默认的作用
    
  • 函数返回值:

    成功:返回以前的信号处理函数

    出错:-1

atoi函数
  • int atoi(const char *nptr)

  • 函数功能:将指向存储字符串首地址的指针指向的字符型数据转换为整型数据

  • 需要的头文件:

    #include <stdlib.h>

  • 函数名:atoi

  • 函数参数:

    nptr:指向字符串首地址的指针

  • 函数返回值:

    >0的整数:当转换成功时,返回转换后的整数

    0:当转换失败时,返回0

2 线程相关的第三方线程库提供的函数

2.1 线程使用相关函数

pthread_create函数

  • int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *),void *arg)//在进程中使用

  • 函数功能:创建一个线程

  • 需要的头文件:

    #include <pthread.h>

  • 函数名:pthread_create

  • 函数参数:

    thread:指向线程id的指针

    attr:指向线程属性的指针,通常给NULL

    (*start_routine) (void *):指向线程执行函数的指针

    arg:传给线程执行函数的入参

  • 函数返回值:

    0:成功

    非0:失败

pthread_join函数

  • int pthread_join(pthread_t thread, void **value_ptr)//在进程中使用

  • 函数功能:阻塞等待线程退出,回收线程退出状态值

  • 需要的头文件:

    #include <pthread.h>

  • 函数名:pthread_join

  • 函数参数:

    thread:线程ID

    value_ptr:指向线程退出状态值的指针

  • 函数返回值:

    0:成功

    非0:失败

pthread_exit函数

  • int pthread_exit(void *value_ptr)//在线程中使用

  • 函数功能:退出当前线程

  • 需要的头文件:

    #include <pthread.h>

  • 函数名:pthread_exit

  • 函数参数:

    value_ptr:指向线程退出状态的指针

  • 函数返回值:

    0:成功

    非0:失败

pthread_cancel函数

  • int pthread_cancel(pthread_t thead)//在进程中使用

  • 函数功能:取消线程/关闭线程

  • 需要的头文件:

    #include <pthread.h>

  • 函数名:pthread_cancel

  • 函数参数:

    thead:线程ID

  • 函数返回值:

    0:成功

    非0:失败

2.2 线程同步相关函数

sem_init函数

  • int sem_init(sem_t *sem, int pshared, unsigned int value)

  • 函数功能:初始化信号量

  • 需要的头文件:

    #include <semaphore.h>

  • 函数名:sem_init

  • 函数参数:

    sem:信号量对象

    pshared:决定信号量能否在进程间共享,一般为0

    value:信号量初始化值

  • 函数返回值:

    0:初始化成功

    -1:初始化失败

sem_wait函数

  • int sem_wait(sem_t *sem)

  • 函数功能:获取信号量,若不成功则阻塞。当sem > 0时,函数返回,sem–;当sem=0时,阻塞当前线程

  • 需要的头文件:

    #include <semaphore.h>

  • 函数名:sem_wait

  • 函数参数:

    sem:信号量对象

  • 函数返回值:

    0:表示成功

    -1:表示出现错误,信号量的值保持不变

sem_post函数

  • int sem_post(sem_t *sem)

  • 函数功能:释放信号量。给信号量为0的信号量+1,sem++

  • 需要的头文件:

    #include <semaphore.h>

  • 函数名:sem_post

  • 函数参数:

    sem:信号量对象

  • 函数返回值:

    0:表示成功

    -1:表示出现错误,信号量的值保持不变

2.3 线程互斥相关函数

pthread_mutex_init函数

  • int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)

  • 函数功能:初始化互斥锁

  • 需要的头文件:#include <pthread.h>

  • 函数名:pthread_mutex_init

  • 函数参数:

    mutex:指向互斥锁对象的指针

    attr:互斥锁属性,一般给NULL

  • 函数返回值:

    0:初始化成功

    非0:初始化失败

pthread_mutex_lock函数

  • int pthread_mutex_lock(pthread_mutex_t *mutex)

  • 函数功能:给公共资源加锁

  • 需要的头文件:#include <pthread.h>

  • 函数名:pthread_mutex_lock

  • 函数参数:

    mutex:指向互斥锁对象的指针

  • 函数返回值:

    0:加锁成功

    非0:加锁失败

pthread_mutex_unlock函数

  • int pthread_mutex_unlock(pthread_mutex_t *mutex)

  • 函数功能:给公共资源解锁

  • 需要的头文件:#include <pthread.h>

  • 函数名:pthread_mutex_unlock

  • 函数参数:

    mutex:指向互斥锁对象的指针

  • 函数返回值:

    0:解锁成功

    非0:解锁失败

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值