操作系统进程学习

the address of pdf

http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-api.pdf

homework 1

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[]) {

    printf("hello world (pid:%d)\n", (int) getpid());
    int x = 100;

    int rc = fork();
    
    if (rc < 0 ){
        printf("fork process failed\n");
        exit(1);
    } else if (rc == 0) {
        x++;
        printf("x=%d\n",x);
        printf("hello, I am child (pid:%d)\n", (int) getpid());
    } else {
        x++;
        printf("x=%d\n",x);
        printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
    }
    printf("finaly x=%d\n",x);
    return 0;
}

the output 



parent and child process both add x from 100; 是不是并发时变量的更改时不受控制的,在并发中应该解决这个问题。


homework 2

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc, char *argv[]) {

    printf("hello world (pid:%d)\n", (int) getpid());

    int rc = fork();
    
    if (rc < 0 ){
        printf("fork process failed\n");
        exit(1);
    } else if (rc == 0) {
        close(STDOUT_FILENO);
        open("./h2.output", O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU);
        printf("hello, I am child (pid:%d)\n", (int) getpid());  
    } else {
        close(STDOUT_FILENO);
        open("./h2.output", O_CREAT|O_WRONLY|O_TRUNC, S_IRWXU);   
        printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
    }
    return 0;
}

the content of file h2.output

hello, I am child (pid:21820)

是否是只有子进程才能操作文件???


homework 3

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
int main(int argc, char *argv[]) {

    printf("hello world (pid:%d)\n", (int) getpid());

    int rc = fork();
    
    if (rc < 0 ){
        printf("fork process failed\n");
        exit(1);
    } else if (rc == 0) {
        printf("hello, I am child (pid:%d)\n", (int) getpid());
    } else {
        do {
            sleep(1);
        } while (waitpid(-1,NULL,WNOHANG) == 0);
        
        printf("goodbye, I am parent of %d  (pid:%d)\n", rc, (int) getpid());
    }
    return 0;
}


homework4

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
int main(int argc, char *argv[]) {

    printf("hello world (pid:%d)\n", (int) getpid());

    int rc = fork();
    
    if (rc < 0 ){
        printf("fork process failed\n");
        exit(1);
    } else if (rc == 0) {
        printf("hello, I am child (pid:%d)\n", (int) getpid());
        char *myargs[3];
        myargs[0] = strdup("ls");
        myargs[1] = strdup("./");
        myargs[2] = NULL;
        execl("/bin/ls", "ls", "-al", "./", (char *) 0);
        //first
        //execvp(myargs[0], myargs);
        printf("this shouldn't print out\n");
    } else {
        //父进程会运行的,如果使用了wait会等待子进程完成之后再运行
        int wc = wait (NULL);
        printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc, wc, (int) getpid());
    }
    return 0;
}



homework 5

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
int main(int argc, char *argv[]) {

    printf("hello world (pid:%d)\n", (int) getpid());

    int rc = fork();
    
    if (rc < 0 ){
        printf("fork process failed\n");
        exit(1);
    } else if (rc == 0) {
        int test = wait(NULL);
        printf("hello, I am child (pid:%d) (wid:%d)\n", (int) getpid(), test);
        char *myargs[3];
        myargs[0] = strdup("wc");
        myargs[1] = strdup("p3.c");
        myargs[2] = NULL;
        execvp(myargs[0], myargs);
        printf("this shouldn't print out");
    } else {
        //父进程会运行的,如果使用了wait会等待子进程完成之后再运行
        int wc = wait (NULL);
        printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc, wc, (int) getpid());
    }
    return 0;
}

child process return -1



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值