linux:實訓及部分程式碼
專案一第一題
1、makefile檔案編寫
實驗內容:程式功能,主函式通過呼叫函式isPrime(num)判定num是否素數,
並生成一個100個元素為素數的陣列,然後呼叫函式outprime(int a[],int n)輸出n個素數
。通過編寫一個makefile檔案,實現三個模組的C語言程式編譯執行。
findprime.c
#include "findprime.h"
int main(){
int a[N],count=0,num=2;
count=0;
while(count<100){
if(isprime(num)){
a[count]=num;
count++;}
num++;
}
printf("% primes:\n" ,count);
outprime(a,count);
return 0;
}
findprime.h
#include <stdio.h>
#define N 100
int isprime(int num);
void outprime(int a[],int n);
Makefile
#Makefile
findprime:findprime.o myproc1.o myproc2.o
gcc -lm -o findprime findprime.o myproc1.o myproc2.o
mv -f findprime "$HOME/bin"
findprime
findprime.o: findprime.c findprime.h
gcc -c findprime.c
myproc1.o:myproc1.c
gcc -c myproc1.c
myproc2.o:myproc2.c
gcc -c myproc2.c
clean:
rm "$HOME/bin/findprime" myproc1.o myproc2.o findprime.o
myproc1.c
#include <stdio.h>
#include <math.h>
int isprime(int num){
int k;
int n;
n=(int )sqrt(num);
for(k=2;k<=n&&num%k!=0;k++);
if(k>n)
return 1;
else return 0;
}
myproc2.c
#include <stdio.h>
void outprime(int a[],int n){
int i;
for(i=0;i<n;i++){
printf("%5d",a[i]);
if((i+1)%10==0)printf("\n");
}}
專案一第二題
讀寫檔案與程序程序管理系統呼叫綜合程式設計
myproc3.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
extern int errno;
int main(){
char buf[100];
pid_t cld_pid,pt_pid;
int fd,status;
if((fd=open("temp",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU))==-1){
printf("open error %d \n",errno);
exit(1);
}
strcpy(buf,"This is parent process write");
pt_pid=getpid();
if((cld_pid=fork()==0)){ //子程序
strcpy(buf,"This is child process write");
printf("My PID(child) is %d \n",getpid());
printf("My parent PID is %d \n",pt_pid);
write(fd,buf,strlen(buf));
close(fd);
exit(0);
}
else{//父程序
printf("This parent process\n");
printf("My PID(parent) is %d\n",getpid());
printf("My child PID is %d\n",cld_pid);
write(fd,buf,strlen(buf));
close(fd);
}
wait(&status);
return 0;
}
專案一第三題
(1)自行編寫一個C語言程式,在主程序中生成兩個子程序,
在子程序1中將“1111111111”、“2222222222”、……、“9999999999”寫入檔案myfile,
在子程序2中將“AAAAAAAAAA”、“BBBBBBBBBB”、……、“ZZZZZZZZZZ”寫入檔案myfile。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(){
pid_t cid,ppid;
char buf;
int in,i,j;
if (cid=fork()!=-1)
{ in=open("myfile",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
for (i=0;i<9;i++){
for(j=0;j<10;j++){
buf ='1'+i;
write(in,&buf,1);
}
write(in, "\n", 1);
}
}
if(ppid!=-1){
for (i=0;i<26;i++){
for (j=0;j<10;j++){
buf = 'A'+i;
write(in,&buf,1);
}
write(in,"\n",1);
}
close(in);
}
}
專案一第四題
編制並除錯一個多程序程式,主程序中通過生成2個子程序,其中子程序1
呼叫gen_prime()生成從2開始的素數,存入共享記憶體,程序2呼叫out_num()
從共享記憶體取出資料顯示輸出,每行輸出10個數。注意兩個程序同步問題,
通過使用訊號量sem_t型別變數實現同步互斥。
為了簡化程式,也可以採用呼叫sleep(5)讓子程序2先延遲5秒。
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <math.h>
#define MAXSIZE 1000
int isprime(int num){
int k;
int n;
n=(int)sqrt(num);
for(k=2;k<=n&&num%k!=0;k++);
if(k>n)
return 1;
else
return 0;
}
int gen_prime(int *p){
int num=2,len=0;
while(num<MAXSIZE){
if(isprime(num)){
*p=num;
p++;
len++;
}
num++;
}
return len;
}
void out_number(int *p,int n){
int i,j;
for(i=0;i<n;i++){
printf("%d ",*p);
if(i%10==0)
printf("\n");
p++;
}
}
int main(){
pid_t pid;
int *p,*num;
int shmid,shmidn;
shmid=shmget(IPC_PRIVATE,MAXSIZE,IPC_CREAT|0600);
if(shmid<0){
printf("get shm ipc_id error!\n");
exit(1);
}
p=(int *)shmat(shmid,NULL,0);
if((int)*p==-1){
printf("shmat addr error!\n");
exit(1);
}
shmidn=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0600);
if(shmidn<0){
printf("get shm ipc_id error!\n");
exit(1);
}
num=(int *)shmat(shmid,NULL,0);
if((int)*num==-1){
printf("shmat addr error! \n");
exit(1);
}
pid=fork();
if(pid==0){
*num=gen_prime(p);
exit(0);
}
pid=fork();
if(pid==0){
sleep(5);
out_number(p,*num);
exit(0);
}
sleep(10);
exit(0);
}
專案二方法四
1)建立1個組群賬戶,取名stugrp,設定GID=610;
(2)批量建立50個使用者stu001,stu002,…,stu050,設定其UID=510,511,512,…,559。並設定GID=610,設定使用者主目錄為/home/stu001,… ,/home/stu050,
設定shell為/bin/bash。
adduser.sh
#/bin/bash
uid=500
gid=610
for((i=1;i<$51;i++))
do
if [ "$i" -lt 10 ]
then
uname=stu0$i
else
uname=stu$i
fi
let "uid=uid+1"
echo $uname:x:$uid:$gid:$uname:/home/$uname:/bin/bash>>user.txt
echo $uname:stu123>>userpw.txt
done
專案三
編寫一個顯示選單的shell程式,利用函式實現簡單的選單功能,n的值由鍵盤輸入:
===========================================**
(1)計算1到n的奇數之和;
(2)計算1到n的階乘;
(3)計算1到n的所有素數;
(4) 退出
==========================================
Please enter function select and number: 1 1000
#/bin/bash
function method1(){
sum=0
for((i=1;i<=$y;i++,i++))
do
let "sum=sum+i"
done
echo "1 add to n sum is $sum"
}
function method2(){
sum1=1
sum2=0
for((i=1;i<=$y;i++))
do
let "sum1=sum1*i"
done
echo "1 to n allsum is $sum1"
}
function method3(){
for((i=2;i<$y;i++))
do
isprime
if [ "$?" -eq 0 ]
then echo -n "$i "
fi
done
echo
}
function isprime(){
if((i==2))
then return 0
elif((i%2==0))
then
return 1
fi
bond=$((i/2));flag=0
for((k=3;k<=bond;k=k+2))
do
if((i%k==0));then
flag=1
break
fi
done
return $flag
}
#主函式 輸入x y 如果x為4退出迴圈
x=0
for((;$x!=4;))
do
echo ===========================================
echo "** (1)計算1到n的奇數之和; **"
echo "** (2)計算1到n的階乘; **"
echo "** (3)計算1到n的所有素數; **"
echo "** (4)退出程式。 **"
echo ==========================================
echo -n Please enter function select and number:
read x y
case $x in
1) method1 ;;
2) method2 ;;
3) method3 ;;
esac
done