里奴性進程控制實驗報告
實驗名稱: Linux進程控制
實驗要求:一.編寫一個Linux系統C程序,由父親創建2個子進程,再由子進程各自從控制臺接收一串字符串,保存在各自的全局字符串變量中,然后正常結束。父進程調用waitpid等待子進程結束,并分別顯示每個子進程的進程標識號和所接收的字符串。
二. 父進程創建一子進程,父進程向子進程發送數據,子進程接收數據,并寫入文件。
關鍵問題: 一.需要用共享內存或使用vfork()函數創建子進程進行進程之間的數據共享及傳遞。父進程必須等待子進程結束才能繼續執行。
二.注意信號的使用。子進程需等待父進程發送信號才執行相應操作。父,子進程之間的通信需要用到共享內存或者父進程用vfork()創建子進程。
設計思路: 一.父進程使用vfork()創建兩個子進程,以此實現進程之間的通信。子進程一用str1保存輸入的字符串,子進程二用str2保存字符串。父進程用waitpid函數等待兩個子進程分別輸入完字符串,然后再分別把str1,str2顯示出來。
二.用共享內存的方法來實現父子進程之間的通信,首先建立共享內存區域,然后建立子進程,并讓子進程等待父進程信號。在父進程中輸入字符串,并把此字符串保存在共享內存區域,然后向子進程發出信號SIGUSR1,若子進程接受到SIGUSR1信號,則把父進程保存在共享內存區域的字符串取出,并把它寫入文件。
關鍵代碼:
一.
#include
#include
#include
#include
main()
{
pid_t pid1,pid2;
char str1[20],str2[20];
if((pid1=vfork())<0)
{
perror("創建子進程一錯誤!\n");
exit(0);
}
else if(pid1==0)
{
printf("輸入字符串一:");
scanf("%s",str1);
exit(0);
}
if((pid2=vfork())<0)
{
perror("創建子進程二錯誤!\n");
exit(0);
}
else if(pid2==0)
{
printf("輸入字符串二:");
scanf("%s",str2);
exit(0);
}
waitpid(pid1,NULL,0);
waitpid(pid2,NULL,0);
printf("你輸入的字符串一:%s\n",str1);
printf("你輸入的字符串二:%s\n",str2);
}
二.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define key 1024
#define size 160
static void sign(int);
int shmid;
char* shmaddr;
main()
{
pid_t pid;
char str[20];
shmid=shmget(key,size,IPC_CREAT|0600);
if((pid=fork())<0)
{
perror("創建子進程錯誤!\n");
exit(0);
}
else if(pid==0)
{
if(signal(SIGUSR1,sign)==SIG_ERR)
{
printf("SIGUSR1錯誤!\n");
exit(0);
}
pause();
printf("子進程結束!\n");
exit(0);
}
sleep(1);
shmaddr=(char*)shmat(shmid,NULL,0);
printf("請輸入字符串:");
scanf("%s",str);
strcpy(shmaddr,str);
shmdt(shmaddr);
kill(pid,SIGUSR1);
wait();
shmctl(shmid,IPC_RMID,NULL);
}
static void sign(int signnum)
{
int fd;
char* shmaddr;
if(signnum==SIGUSR1)
{
printf("子進程接收到SIGUSR1.\n");
shmaddr=(char*)shmat(shmid,NULL,0);
if((fd=open("testfile.txt",O_RDWR|O_CREAT|O_