进程与线程

博客介绍了进程相关内容,包括进程函数、运行外部程序方式、进程等待等,还列举了各种信号及其说明、信号处理函数、发送信号方法等。此外,涉及线程创建、退出和连接,以及信号量和互斥量的操作函数,涵盖了进程、信号、线程及同步机制的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程函数:

int system(const char *string);           启动shell来运行string

int execl(const char *path, const char *arg0, ... , (char *)0);

int execlp(const char *file, const char *arg0, ... , (char *)0);

int execle(const char *path, const char *arg0, ... , (char *)0, const char *envp[]);

int execv(const char *path, const char *argv[]);

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

int execve(const char *path, const char *argv[],const char *envp[]);

exec将用它运行的代码替换我们当前程序代码,没有错误将不返回

常用运行外部程序方式:

pid_t new_pid = fork();

switch (new_pid){

case -1:

   exit(-1);

   break;

case 0:

   exec(...);

   break;

default:

   break;

}

进程等待:

pid_t wait(int *stat_loc);         一个子进程结束后返回其进程id.stat_loc为子进程退出状态

-----------------------------------------------------------------------------------------------------------------------

     宏定义(sys/wait.h)                                         说明

-----------------------------------------------------------------------------------------------------------------------

WIFEXITED(stat_loc)                               若正常退出, 取非0值

WEXITSTATUS(stat_loc)                        若WIFEXITED非0,返回子进程退出码

WIFSIGNALED(stat_loc)                        若因未捕获的信号终止,取非0值

WTERMSIG(stat_loc)                              若WIFEXITED非0,返回信号代码

WIFSTOPPED(stat_loc)                         若子进程停止,取非0值

WSTOPSIG(stat_loc)                              若WIFSTOPPED非0,返回信号代码

---------------------------------------------------------------------------------------------------------------------------

pid_t waitpid(pid_t pid, int *stat_loc, int options);

pid为-1返回每个子进程的信息; options为WNOHANG调用者执行不挂起,此时返回0表示子进程未

结束,否则为其child_id,-1表示失败

信号

-----------------------------------------------------------------------------------------------------------------------------

   信号名称                                                    说明

-----------------------------------------------------------------------------------------------------------------------------

SIGABORT                                           *进程停止运行

SIGALRM                                              警告钟

SIGFPE                                                 *浮点运算例外

SIGHUP                                                系统挂断

SIGILL                                                   *非法指令

SIGINT                                                  终端中断

SIGKILL                                                停止进程(不能忽略或被俘获)

SIGPIPE                                               向无读者的管道写数据

SIGQUIT                                               终端退出

SIGSEGV                                              *无效内存段访问

SIGTERM                                              终止

SIGUSR1                                              用户定义信号1

SIGUSR2                                              用户定义信号2

--------------------进程收到以上某信号而未事先安排捕获则立刻终止------------------------------------

SIGHLD                                                子进程已停止或退出(默认被屏蔽)

SIGCONT                                             若被停止则继续运行

--------------------以下信号使接收进程停止运行----------------------------------------------------------------

SIGSTOP                                              停止执行(不能忽略或被捕获)

SIGSTP                                                 终端停止信号

SIGTTIN                                                后台进程请求读操作

SIGTTOU                                              后台进程请求写操作

-------------------------------------------------------------------------------------------------------------------------------

信号处理函数:

void (*signal(int sig, void(*func(int)))(int);    如signal(SIGINT, ouch);  ouch为一个处理函数,

返回是此前处理此信号的函数指针.

发送信号:

int kill(pid_t pid, int sig); 普通用户只能向同用户进程发送信号.失败返回-1,errno=EINVAL

信号无效,EPERM权限不足,ESRCH指定进程不存在

闹钟信号

unsigned int alarm(unsigned int seconds); 每个进程一个alarm,重新调用重新计时,参数0取消已设置.

返回前一个闹钟还有多少时间发生信号.

int pause(void);  程序挂起直到收到信号

健壮的信号接口

int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

act为新的信号操作结构,oact为原来的,成功返回0.

sigaction 包括void (*)(int) sa_handler;        sigset_t  sa_mask;            int sa_flags;等

sa_mask指定的信号将被堵塞

sa_flags为

SA_NOCLDSTOP 子进程停止时不产生SIGCHLD信号

SA_RESETHAND 对信号处理重置为SIG_DFL

SA_RESTART 重新启动中断函数而不是给出EINTR错误

SA_NODEFER 捕获时不把信号添加到信号掩码中

信号集:

int sigaddset(sigset_t *set, int signo);

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigdelset(sigset_t *set, int signo);

int sigismember(sigset_t *set, int signo);

信号掩码设置检测:

int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

how = SIG_BLOCK / SIG_SETMASK / SIG_UNBLOCK

分别表示在掩码中添加,设置为或去掉set中定义的信号

查看阻塞的信号 int sigpending(sigset_t *set);

挂起进程至指定信号到达 int sigsuspend(const sigset_t *sigmask);

线程

创建新线程

#include <pthread.h>

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *argv);

void pthread_exit(void *retval);

void pthread_join(pthread_t th, void **thread_return);

信号量

#include <semaphore.h>

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

sem为指定的信号量, pshared表示进程局部或者进程共享信号量(0/1),value为初始值

int sem_wait(sem_t *sem);  减1操作    int sem_trywait(...)非阻塞模型

int sem_post(sem_t *sem);   加1操作

int sem_destroy(sem_t *sem);


互斥量

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值