Linux实验代码

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/wait.h>

typedef struct _list
{
    struct _list *next;
    int _val;
}product_list;

product_list *head = NULL;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t need_product = PTHREAD_COND_INITIALIZER;

void Init_list(product_list* list)
{
    if(list != NULL)
    {
        list -> next = NULL;
        list -> _val = 0;
    }
}

void* Consumer(void* _val)
{
    product_list *p = NULL;
    for(;;)
    {
        pthread_mutex_lock(&lock);
        while(head == NULL)
        {
            pthread_cond_wait(&need_product,&lock);
        }
        p = head;
        head = head -> next;
        p -> next = NULL;
        pthread_mutex_unlock(&lock);
        printf("Consum success,val is:%d\n",p -> _val);
        free(p);
    }
    return NULL;
}

void* Product(void* _val)
{
    for(;;)
    {
        sleep(rand() % 2);
        product_list* p =malloc(sizeof(product_list));
        pthread_mutex_lock(&lock);
        Init_list(p);
        p -> _val = rand() % 1000;
        p -> next = head;
        head = p;
        pthread_mutex_unlock(&lock);
        printf("Call consumer! Product has producted,val is:%d\n",p->_val);
        pthread_cond_signal(&need_product);
    }
}

int main()
{
    pthread_t t_product;
    pthread_t t_consumer;
    pthread_create(&t_product,NULL,Product,NULL);
    pthread_create(&t_consumer,NULL,Consumer,NULL);

    pthread_join(t_product,NULL);
    pthread_join(t_consumer,NULL);
    return 0;
}

 

 

实验三

进程的终止与等待,

参考《Linux操作系统基础、原理与应用(第2版)》p107例5-4,

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<sys/wait.h>

int main()

{

  int rid, cid, status;

  rid = fork();

  if ( rid < 0 ) { printf(“fork error!”; exit(1); }

  if ( rid > 0 ) { printf(“Child: I will exit in 10 seconds.\n”);

                   sleep(10);

                   exit(0);

  }

  cid=wait(&status);

  printf(“Parent: I caught a child with PID of %d.\n”, cid);

  if ((status & 0377) == 0)

        printf(“It exited normally, with status of %d.\n”, status>>8);

  else printf(“It was terminated by signal %d.\n”, status&0177);

  exit(0);

}

 

实验四

fork()、exec()和wait()系统调用写一个简单的测试程序。父进程创建一个子进程,执行date命令。子进程结束后,父进程输出子进程的PID和退出码

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<sys/wait.h>

int main()

{

  int rid, cid, status;

  rid = fork();

  if ( rid < 0 ) { printf(“fork error!”; exit(1); }

  if ( rid > 0 ) { execlp(“date”, “date”, NULL);

                   exit(0);

  }

  cid=wait(&status);

  printf(“Parent: I caught a child with PID of %d.\n”, cid);

  if ((status & 0377) == 0)

        printf(“It exited normally, with status of %d.\n”, status>>8);

  else printf(“It was terminated by signal %d.\n”, status&0177);

  exit(0);

}

posted @ 2020-11-17 12:52  爱你一生12581  阅读(180)  评论(0编辑  收藏  举报