1. 程式人生 > >linux:實訓及部分程式碼

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