乙個簡單小程式

2021-08-22 16:13:24 字數 2961 閱讀 9001

實現這麼乙個程式:

從磁碟上讀取檔案,對檔案內容解析,解析出兩個加數,生成乙個可以執行加法運算的動態庫,呼叫該動態庫進行加法計算,再將計算結果寫入共享記憶體,然後建立子程序,子程序進行程式替換,替換的程式要完成的任務就是將共享記憶體中的內容重新寫回磁碟上的該檔案,記得使用共享記憶體時要借助訊號量保證互斥操作。

具體過程如下圖:

**實現:

add.h

#ifndef __add_h__

#define __add_h__

int add(int left,int right);

#endif//__add_h__

add.c

#include "add.h"

int add(int

left,int

right)

main.c

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "add.h"

void handler(int s)

int main()

int r;

char buf[100];

memset(buf,0x00,sizeof(buf));

label:

r=read(fd,buf,sizeof(buf));//不能在label下定義變數,因為有可能不能執行到該處

if(r==-1)

close(fd);

//呼叫add函式計算加法

int left,right;

sscanf(buf,"%d+%d",&left,&right);//格式化解析字串

r=add(left,right);

//將計算結果寫入共享記憶體

memset(buf,0x00,sizeof(buf));

sprintf(buf,"%d+%d=%d\n",left,right,r);

int shmid=shmget(1234,strlen(buf),ipc_creat|0644);//建立共享記憶體

char *addr=shmat(shmid,null,0);//將共享記憶體掛載到該程序的位址空間

int semid=semget(1234,1,ipc_creat|0644);//建立訊號量

union semun;

union semun su=;

semctl(semid,0,setval,su);//訊號量設初值

struct sembuf sbp=};

struct sembuf sbv=};

semop(semid,sbp,1);//上鎖

memcpy(addr,buf,strlen(buf));//將資料寫入共享記憶體段,實際工作中一般用memcpy進行拷貝,可以限定addr的大小,安全

semop(semid,sbv,1);//解鎖

shmdt(addr);//解除安裝共享內粗

//建立子程序,讓子程序呼叫mywrite程式,將結果寫入程式

pid_t pid=fork();

if(pid==-1)

if(pid==0)

;execvp("./mywrite",argv);

perror("execvp");//執行到該處說明mywrite不存在,execvp執行失敗

exit(1);

}for(;;)

}

write.c

#include 

#include

#include

#include

#include

#include

#include

#include

int main()

}; struct sembuf sbv[1]=};

//上鎖

semop(semid,sbp,1);

memcpy(buf,addr,strlen(addr));

semop(semid,sbv,1);

//解鎖

shmdt(addr);

//寫檔案

int fd=open("./tmp",o_trunc|o_wronly);

if(fd==-1)

write(fd,buf,strlen(buf));

close(fd);

shmctl(shmid,ipc_rmid,0);

semctl(shmid,0,ipc_rmid);

}

makefile

.phony:all clean

all:main mywrite

main:main.o libadd.so

gcc $< -o $@ -l. -ladd

libadd.so:

add.c

gcc -fpic -shared -o $@ $<

mywrite:mywrite.o

gcc $^ -o $@

%.o:%.c

gcc -c $< -o $@

clean:

rm -rf *.o mywrite main

乙個簡單的verlig程式 乙個簡單C程式的介紹

我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...

乙個java小程式

能讓阿拉伯數字讀成符合漢語語法和漢語習慣的中文.就這我 還做了一天呢 鬱悶.public class itcs string unit1 new string string unit2 new string string str args 0 string str 2 null system.out...

乙個socket小程式

一直對c c 下的socket程式設計必是很熟悉,今天終於完成了乙個很簡單的server client程式 伺服器 include include pragma ment lib,ws2 32.lib using namespace std const int my error 1 int main...