36.1
编写一个程序使用getrusage0 RUSAGE CHILDREN标记获取wait调用所等待的
子进程相关的信息。(让程序创建一个子进程并使子进程消耗一些 CPU 时间,接着
让父进程在调用wait0前后都调用getrusage0。
1 | // |
36.2
编写一个程序来执行一个命令,接着显示其当前的资源使用。这个程序与 time(1)
命令的功能类似,因此可以像下面这样使用这个程序:
1 | $ ./rusage command arg... |
编写一个程序使用getrusage0 RUSAGE CHILDREN标记获取wait调用所等待的
子进程相关的信息。(让程序创建一个子进程并使子进程消耗一些 CPU 时间,接着
让父进程在调用wait0前后都调用getrusage0。
1 | // |
编写一个程序来执行一个命令,接着显示其当前的资源使用。这个程序与 time(1)
命令的功能类似,因此可以像下面这样使用这个程序:
1 | $ ./rusage command arg... |
nice值形象的说是一个进程的友好(nice)程度,越nice(nice值数值越大的)的进程越礼让,多个任务争用cpu的时候越礼让。(本书中高nice值表示nice值数值更低,更不nice
资源限制,特权进程最高可以将nice值提升到20-RLIMIT_NICE
假设一个父进程执行了下面的步骤。
这个应用程序设计可能会碰到什么问题?考虑 shell 管道。
如何避免此类问题的发生?
1 |
|
SIGUSER1child-%d: %d被重复输出了多次,这是由于stdout被重定向后变成了全缓冲,fork的子进程退出后fflush()时会将fork前未flush的数据打印出来。./practice34.1 | cat,输出会是User defined signal 1,即cat与程序同属一个进程组,cat也会收到该信号,导致无法正常执行(非预期内)编写程序以便证明:作为函数sigpending()的返回值,同一个进程中的的不同线程可以拥有不同的 pending信号。可以使用函数pthread_kill(分别发送不同的信号给阻塞这些信号的两个不同的线程,接着调用sigpending()方法并显示这些pending信号的信息。(可能会发现程序清单20-4中函数的作用。)
1 | // |
假设一个线程使用fork()创建了一个子进程。当子进程终止时,可以保证由此产生的SIGCHLD信号一定会发送给调用fork()的线程吗(可以用进程中的其他线程做对比)?
1 | // |
从作用域的角度上看,带参宏和函数的区别:
pthread_cleanup_push和pthread_cleanup_pop,很多实现都是使用带参宏,那么这两个宏调用时必须属于同一个代码块?,保证push的作用域包含pop不就好了吗
线程取消状态可设置为启用和禁用。
pthread_once(pthread_once_t*, void (*)(void));int pthread_key_create(pthread_key_t *, void (*)(void *));每个线程都存储一份,第一个参数为一个全局变量的指针,第二个参数为线程终止时自动调用的析构函数int pthread_setspecific(pthread_key_t, const void *)指定key所对应的内存区域,进程终止时会将第二个参数送入析构函数void * pthread_getspecific(pthread_key_t)获取key所对应的内存区域实现pthread_once
1 | // |
一般搭配一个条件和一个互斥量使用
经典的使用方式如下
mutex加锁,以读取conditionmutex解锁pthread_cond_waitmutex(允许其他进程获取mutex以修改状态)pthread_cond_signal或pthread_cond_broadcast唤醒wait阻塞(故此处需要用while)mutexconditionsignal/broadcastunlock(unlock与上一步顺序可调换)1 | // one thread |
若一线程执行了如下代码,可能会产生什么结果?
pthread_join(pthread_self(),NULL);
在 Linux上编写一个程序,观察一下实际会发生什么情况。假设代码中有一变量 tid,其中包含了某个线程ID,在自身发起pthread_join(tid, NULL)调用时,要避免造成与上述语句相同的后果,该线程应采取何种措施?
1 |
|
pthread_join返回值非0,出现错误,errno表示SUCCESS
为啥是success呢,errno不是一个线程一份吗,还是这个函数不算系统调用??可能是他调用了waitpid,但是出错位置不在waitpid
"/"的路径,在path中寻找env PATH默认为.:/usr/bin/:/bin当exec第一个参数文件以"#!"开始,则会读取该行进行解析
1 | #!<interpreter-path> [arg] <script> <script-args...> |
如
编写一程序以验证当一子进程的父进程终止时,调用getppid()将返回1(进程 init的进程ID)。
无聊,不弄