unix程式設計實驗五 實現mysleep函式

2021-06-07 04:30:21 字數 1547 閱讀 2799

實驗五 實現mysleep函式

實驗描述

函式名字和原型:

unsigned int mysleep(unsigned int);

該函式的功能要求與unix的sleep函式一樣。

要求:1、使用alarm函式實現定時。

2、必須正確處理mysleep函式中的鬧鐘與呼叫者可能設定的鬧鐘之間的關係。例如,如何解決不同的訊號處理函式的儲存和恢 復?如何處理呼叫者設定的鬧鐘比mysleep函式中的鬧鐘早響的問題?如何處理呼叫程序遮蔽sigalrm訊號?

3、不允許出現任何竟態條件(時間視窗)。

4、總之,mysleep的實現細節應當對呼叫者透明,也就是說, 不論在實現mysleep函式時是否使用了alarm函式,對呼叫者是 否以及如何使用alarm函式均不應有任何影響。

主要原理

1、以書中10-21 sleep的可靠實現為藍本,引入與以前設定的鬧鐘的互動作用

2、使用flag判斷是否存在前置鬧鐘,存在則返回剩餘值,不存在則返回零(儲存sigalarm訊號處理程式的位址,並在返回前復位它)

實驗**:mysleep.c

#include "apue.h"

static void sig_alrm(int signo)

unsigned int mysleep(unsigned int nsecs)

structsigaction newact, oldact;

sigset_t newmask, oldmask, suspmask, blockedmask;

intissuspend = 0;/* sigalrm是否被阻塞 */

intisblocked = 0;/* 是否存在未決的sigalrm */

unsigned int unslept, slept;

unsigned int oldalarm;

oldalarm = alarm(0);

/* 儲存以前的sigalrm配置,並設定成我們需要的配置 */

newact.sa_handler = sig_alrm;

sigemptyset(&newact.sa_mask);

newact.sa_flags = 0;

sigaction(sigalrm, &newact, &oldact);

/* 處理以前的sigalrm */

/* 判斷sigalrm是否被阻塞 */

sigprocmask(sig_block, null, &oldmask);

if(sigismember(&oldmask, sigalrm))

static void sig_usr1(int signo)

static void loopwait(unsigned int nsecs)

void testsleep(unsigned int oldsecs, unsigned int nsecs)

else

}main()

UNIX網路程式設計學習 五 UDP程式設計

udp相比tcp是無連線的。它收發資料是通過recvfrom和sendto兩個函式。它們的原型如下 ssize t recvfrom int sockfd,void buff,size t nbytes,int flags,struct sockaddr from,socklen t addrlen...

《UNIX網路程式設計》實驗環境搭建 unp h

學linux下的網路程式設計,stevens的 unix網路程式設計 卷一 不可不看。經典中的戰鬥機。本文記錄實驗環境的搭建過程。本人linux用的是centos 6.4 得到原始碼包 unpv13e.tar.gz tar zxvf unpv13e.tar.gz cd unpv13e 閱讀readm...

Unix程式設計 實現cp命令

最近苦讀 unix系統程式設計 便寫了一些例項,逐步增加自己unix程式設計的能力。首先來實現乙個unix下常用命令 cp 先看 include include include define bufsize 512 define perm 0755 copy file function int co...