LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1973|回复: 11

我的操作系统的上机作业

[复制链接]
发表于 2002-11-5 13:58:28 | 显示全部楼层 |阅读模式
我是大肆学EE的,正在学操作系统,这是上机作业
1自己设计一个程序,创建一个子进程,使父子进程合作协调完成某个功能,要求在该程序中还要使用进程的睡眠、进程图象改换、父进程等待子进程终止、信号的处理与传送(包括信号处理程序),子进程的终止等有关的系统调用
2分别用unix的消息通信机制、共享内存机制(用信号灯实现同步和互斥)实现两个进程间的数据通信。
我们的教材是操作系统教程 电子工业出版社 主编:陆松年
还请大家考虑考虑,明天就要上机了,今天看来不能睡觉了
我的qq是5542825
如果谁有这方面的经验和资料请加我吧
或者回帖马上哦
发表于 2002-11-6 17:28:03 | 显示全部楼层
能不能讲详细一点,比如在什么情况下等待进程终止,改换进程图像的目的是什么?泛泛而谈是不行的,要联系实际。
 楼主| 发表于 2002-11-6 18:14:19 | 显示全部楼层

这是上机题目啊,不是实际应用

其实书上都有的,我等会整理一下再贴出来
 楼主| 发表于 2002-11-7 08:47:35 | 显示全部楼层

进程图象改换

#include <stdio.h>
main ()
{
int i,pid,status=1;
printf("Before fork call\n");
while((i=fork())==-1);
if(i){
        printf("It is PP.\n");
        pid=wait(&status);
        printf("CP %d,status=%d\n",pid,status);
}else{
        printf("It is CP.\n");
        execl("/bin/ls","ls","-l",(char*)0);
        printf("execl error.\n");
        exit(2);
}
printf("P finish.\n");
}
 楼主| 发表于 2002-11-7 08:50:02 | 显示全部楼层

消息通信机制

/*msgcom.h*/
# include <errno.h>
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
#define MSGKEY 5678
struct msgtype{
        long mtype;
        int text;
};
/*server.h*/
#include "msgcom.h"
main ()
{
struct msgtype buf;
int qid;
if((qid=msgget(MSGKEY,IPC_CREAT|0666))== -1)
        return (-1);
while(1){
msgrcv(qid,&buf,512,1,MSG_NOERROR);
printf("Server recieve a request from process %d\n",buf.text);
buf.mtype=buf.text;
msgsnd(qid,&buf,1,0);
}
}
/*client.h*/
# include "msgcom.h"
main ()
{
        struct msgtype buf;
        int qid ,pid;
        qid=msgget(MSGKEY,IPC_CREAT|0666);
        buf.mtype=1;
        buf.text=pid=getpid();
        msgsnd(qid,&buf,sizeof(buf.text),0);
        msgrcv(qid,&buf,512,pid,MSG_NOERROR);
        printf("Request recieved a message from server,type is: %d\n",buf.text);
}
 楼主| 发表于 2002-11-7 08:51:41 | 显示全部楼层

共享内存机制(用信号灯实现同步和互斥)

# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>
# include <sys/sem.h>

#define SHMKEY 180001
#define SIZE 1024
#define SEMKEY1 190001
#define SEMKEY2 190002

int creatsem ();
void P(),V();//,syserr();

main ()
{
char *segaddr;
int segid, sid1,sid2;

segid=shmget(SHMKEY,SIZE,IPC_CREAT|0666);
//syserr("shmget");
segaddr=shmat(segid,0,0);
sid1=creatsem(SEMKEY1);
sid2=creatsem(SEMKEY2);
P(sid2);
if(!fork())
        while(1){
                P(sid2);
                printf("Recieved from Parent: %s\n",segaddr);
                V(sid1);
        }
        while(1){
                P(sid1);
                scanf("%s",segaddr);
                V(sid2);
        }
}

int creatsem(key)
key_t key;
{
int sid;
union semun{
        int val;
        struct semid_ds *buf;
        ushort *array;
        }arg;
sid=semget(key,1,0666|IPC_CREAT);
        //syserr("semget");
arg.val=1;
semctl(sid,0,SETVAL,arg);
        //syserr("semctl");
return(sid);
}
void P(sid)
int sid;
{
static void semcall();
semcall(sid,-1);
}

void V (sid)
int sid;
{
static void semcall();
semcall(sid,1);
}

static void semcall (sid,op)
int sid,op;
{
struct sembuf sb;
sb.sem_num=0;
sb.sem_op=op;
sb.sem_flg=0;
semop(sid,&sb,1);
        //syserr("semop");
}
 楼主| 发表于 2002-11-7 08:53:34 | 显示全部楼层

信号的处理与传送(包括信号处理程序),进程的睡眠、

#include <sys/types.h>
#include <signal.h>
main ()
{
int status;
pid_t pid;
void func ();
signal(SIGUSR1,func);
if(pid=fork()){
printf("arent:will send signal.\n");
kill(pid,SIGUSR1);
wait(&status);
printf("status=%darent finished.\n",status);
}else{
sleep(5);
printf("Child: signal is recieved.\n");
exit(0);
}
}
void func()
{
printf("It is a signal processing function.\n");
}
发表于 2002-11-8 21:28:27 | 显示全部楼层
程序是给出来了,但不知道你需要什么资料?是根据作业要求编写程序吗?
发表于 2002-11-10 09:10:43 | 显示全部楼层
第一个题目我上大二的时候曾做过。
但是在windows下面考虑到多个进程不容易控制,我使用  多线程调度  来模拟  多进程作业。用pascal写的,感觉效果还可以。
看过一本叫做《linux网络编程》的书,机械工业出版社。 开头几章对linux下的进程管理 讲的还不错
发表于 2002-11-10 20:28:23 | 显示全部楼层

Re: 进程图象改换

最初由 ltkun 发布
#include <stdio.h>
main ()
{
int i,pid,status=1;
printf("Before fork call\n");
while((i=fork())==-1);
if(i){
        printf("It is PP.\n");
        pid=wait(&status);
        printf("CP %d,status=%d\n",pid,status);
}else{
        printf("It is CP.\n");
        execl("/bin/ls","ls","-l",(char*)0);
        printf("execl error.\n");
        exit(2);
}
printf("P finish.\n");
}

进程的“图像更改”?怎么听起来这么别扭啊?不就是调用fork命令,子进程使用父进程的各种参数吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表