FIFO有名字,所以只要知道该名字,无关进程之间也可以使用。 19.书名产生信号的几种方式?
(1)用户操作。如键盘操作Ctrl-C,最终使得内核产生信号SIGINT。 (2)进程执行出错。如浮点数溢出,内核也会产生信号。
(3)进程执行某个系统调用。如调用kill向某个进程或进程组发送信号。 20.说明信号传递的过程。 (1)生成(generating)。内核要更新目标进程的数据结构,表示一个新的信号已经被发送给此进程。此时,进程并没有对信号做出任何响应。 (2)传递(delivery)。强迫目标进程对信号做出响应。 四、编程题
1.向文件f1中写入“hello world!”,然后再将f1中的内容读出并显示在屏幕上。(注意必要的错误判断) #include
perror(\ exit(1); } num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1))
printf(\ lseek(fd,0,SEEK_SET); num=read(fd,buf2,12); if(num!=12) printf(\ write(1,buf2,12); close(fd); }
2.向文件f2中写入“aabbccddee”,然后将偏移量移到绝对值偏移为4的位置处,读6个字符,并将结果显示在屏幕上
#include
11
fd = open( \ if(fd==-1) {
perror(\ exit(1); } num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1)) printf(\ lseek(fd,4,SEEK_SET); num=read(fd,buf2,6); if(num!=6) printf(\ write(1,buf2,6); close(fd); }
3.向文件f3中写入“aabbccddeeffgghh”,然后将文件截短后的文件内容读出并显示在屏幕上#include
perror(\ exit(1); } num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1)) printf(\ lseek(fd,0,SEEK_SET); ftruncate(fd,8); num=read(fd,buf2,8); if(num!=8) printf(\ write(1,buf2,8); close(fd); }
4.实现“cat文件名”显示文件内容 #include
main(int argc,char *argv[]) {
12
int fd; int num; char buf[10]; if(argc!=2) {
printf(\ exit(1); }
fd=open(argv[1],O_RDONLY); if(fd==-1) {
perror(\ exit(1); }
while((num=read(fd,buf,10))!=0) write(1,buf,num); close(fd); }
5.实现“cp 原文件 目标文件” #include
main(int argc,char *argv[]) {
int from,to; int num; char buf[10]; if(argc!=3) {
printf(\ exit(1); }
from=open(argv[1],O_RDONLY);
to=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644); num=read(from,buf,10); while(num!=0) { write(to,buf,num); num=read(from,buf,10); }
close(from); close(to); }
6.编写程序pro3.c,将字符串“hello world”通过输出重定向方式写入文件f1中#include
13
#include
7.使用fork创建进程,在子进程中打印“I am the child”和子进程pid,在父进程中打印“I am the father”和父进程pid
#include
pid_t pid; pid = fork(); if(pid < 0) {
perror(\ exit(1); }
else if(pid == 0)
printf(\ else
printf(\ exit(0); }
8.创建子进程,在子进程中执行“ps -A”命令,父进程等待子进程结束后打印“child over” 及所处理的子进程进程号 #include
14
if(pid<0) { perror(“fork”); exit(1); } else if(pid==0) { execvp(args[0],args); exit(0); } else { cpid=wait(NULL); printf(“child over! cpid=%d\\n”,cpid); } }
9.编写程序处理SIGINT信号,当程序接收到SIGINT信号后输出“SIGINT is caught”#include
void signal_handler(int signum) {
switch(signum) {
case SIGINT:
printf(\ break; } }
int main() {
signal(SIGINT,signal_handler); pause(); return 0; }
10.使用PIPE时限父子进程向子进程发送1234567890,子进程接收并显示 #include
int pfd[2]; char buf[32]; pid_t pid; pipe(pfd);
if((pid=fork())<0) perror(\
15