C语言中如何进行线程和进程操作?

C语言在操作系统中提供了一些库函数,可以方便地进行进程和线程的操作。

进程操作

创建新进程

使用 fork() 函数可以在当前进程中创建一个新进程。新进程继承了父进程的所有属性,但是父进程和子进程拥有独立的内存空间。下面是一个示例:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t pid;
    pid = fork();
    if (pid < 0) { // fork失败
        perror("fork error");
    } else if (pid == 0) { // 子进程
        printf("I'm child process with pid %d\n", getpid());
    } else { // 父进程
        printf("I'm parent process with pid %d, my child's pid is %d\n", getpid(), pid);
    }
    return 0;
}

上述代码中,我们使用了 fork() 函数创建了一个新进程。父进程和子进程的 pid 是不同的,可以通过 getpid() 函数获取当前进程的 pid。运行代码,输出如下:

I'm parent process with pid 6249, my child's pid is 6250
I'm child process with pid 6250

等待进程结束

使用 waitpid() 函数可以等待进程结束。下面是一个示例:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    pid_t pid;
    pid = fork();
    if (pid < 0) { // fork失败
        perror("fork error");
    } else if (pid == 0) { // 子进程
        printf("I'm child process with pid %d\n", getpid());
        sleep(3);
    } else { // 父进程
        printf("I'm parent process with pid %d, my child's pid is %d\n", getpid(), pid);
        int status;
        waitpid(pid, &status, 0);
        printf("child process exited with status %d\n", status);
    }
    return 0;
}

上述代码中,父进程等待子进程结束,并且可以获取子进程的结束状态。运行代码,输出如下:

I'm parent process with pid 6265, my child's pid is 6266
I'm child process with pid 6266
child process exited with status 0

线程操作

使用 pthread_create() 函数可以创建新线程。新线程和主线程运行在同一个进程中,共享内存空间,但是有各自独立的栈空间。下面是一个示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * print_hello(void * arg) {
    printf("hello from thread %ld\n", (long)arg);
    pthread_exit(NULL);
}

int main() {
    pthread_t tid;
    int rc = pthread_create(&tid, NULL, print_hello, (void *)1);
    if (rc) {
        perror("pthread_create error");
        exit(1);
    } else {
        printf("hello from main thread\n");
    }
    pthread_join(tid, NULL);
    return 0;
}

上述代码中,我们使用 pthread_create() 函数创建了一个新线程,新线程执行了 print_hello() 函数。主线程继续执行,输出了一行信息。 pthread_join() 函数等待线程结束。运行代码,输出如下:

hello from main thread
hello from thread 1

线程间同步

使用 pthread_mutex_lock()pthread_mutex_unlock() 函数可以实现线程间同步。下面是一个示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int counter;
pthread_mutex_t mutex;

void * increment(void * arg) {
    int i;
    for (i = 0; i < 1000000; i++) {
        pthread_mutex_lock(&mutex);
        counter++;
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&t1, NULL, increment, NULL);
    pthread_create(&t2, NULL, increment, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_mutex_destroy(&mutex);
    printf("counter = %d\n", counter);
    return 0;
}

上述代码中,我们使用了 pthread_mutex_lock()pthread_mutex_unlock() 函数来保证 counter 的值能够正确地被多个线程修改。 pthread_mutex_init()pthread_mutex_destroy() 分别用来初始化和销毁互斥锁。运行代码,输出如下:

counter = 2000000

总结

本文介绍了C语言中如何进行进程和线程操作。对于进程,我们使用 fork() 函数创建新进程,使用 waitpid() 函数等待进程结束。对于线程,我们使用 pthread_create() 函数创建新线程,使用 pthread_mutex_lock()pthread_mutex_unlock() 函数实现线程间同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中如何进行线程和进程操作? - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • 浅谈VC++中的内联

    针对“浅谈VC++中的内联”的问题,我为您提供如下攻略。 什么是内联函数? 内联函数是在编译器编译程序的时候,程序员要求编译器将函数直接将函数中的代码插入到函数调用的位置,而不是正常的调用函数的方式。因此,内联函数的执行效率较高,但会增加程序代码的大小。在C++中,使用关键字inline来定义内联函数。 如何在VC++中定义内联函数? 在VC++中,通常使用…

    C 2023年5月23日
    00
  • 剑网3明教怎么玩_剑网3明教贯木流PVE输出攻略(必看)

    剑网3明教怎么玩 简介 《剑网3》作为一款以武学为主题的MMORPG游戏,拥有多个门派供玩家选择。其中明教门派以其独树一帜的特点,备受玩家们的喜爱。本攻略将为大家介绍明教门派的PVE输出攻略,帮助各位玩家更好地在游戏中玩转明教职业。 明教门派的特点 明教门派主修内功心法,拥有较高的爆发输出和回复能力 明教的操作非常流畅,配合技能后摇短,能够进行多种连招输出 …

    C 2023年5月22日
    00
  • C字符串操作函数的实现详细解析

    C字符串操作函数的实现详细解析 1. 什么是C字符串 C语言中的字符串是由一组字符序列组成,以’\0’(空字符)结尾,其在内存中的存储方式是顺序存储的字符数组。由于C语言本身并没有提供字符串类型,所以需要通过字符数组及一些函数来操作字符串。 2. 常用C字符串操作函数 常用的C字符串操作函数有以下几种: strlen:计算字符串的长度 strcpy:将一个字…

    C 2023年5月23日
    00
  • C程序 将华氏温度转换为摄氏温度

    下面我将为您讲解如何使用C程序将华氏温度转换为摄氏温度。 程序介绍 此程序使用C语言编写,可以将输入的华氏温度转换为摄氏温度,转换公式为: C = (F – 32) / 1.8 其中,C表示摄氏温度,F表示华氏温度。 程序使用攻略 本程序可在各大C语言开发环境中运行,以下以Visual Studio Code为例: 打开Visual Studio Code软…

    C 2023年5月9日
    00
  • Python中非常实用的Math模块函数教程详解

    Python中Math模块函数教程详解 Math模块是Python中一个非常实用和重要的模块,它提供了许多数学计算相关的函数,包括三角函数、指数、对数、常数以及其他数学函数。在本文中,我们将介绍一些最常用的Math模块函数及其应用。 1. 导入Math模块 首先,我们需要导入Math模块才能使用它的函数。在Python中,可以使用以下代码导入Math模块: …

    C 2023年5月22日
    00
  • 详解C++11中绑定器bind的原理与使用

    详解C++11中绑定器bind的原理与使用 什么是bind bind是C++11中的一个函数绑定器,它可以将一个函数和一些参数绑定起来,形成一个可调用的新函数对象。绑定函数的参数可以在绑定时全部传递,也可以在调用时再进行部分传递。这种参数的绑定机制,可以方便地用来实现回调函数、函数适配器等功能。 bind函数的原型 template<class F, …

    C 2023年5月22日
    00
  • 逍遥自在学C语言 | 赋值运算符

    前言 在C语言中,赋值运算符用于将一个值赋给变量 这个过程分为两个步骤: 计算赋值运算符右侧的表达式 将结果赋给左侧的变量。 C语言提供了多个不同的赋值运算符,包括基本的赋值运算符、复合赋值运算符以及条件赋值运算符等 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、基本…

    C 2023年4月25日
    00
  • C++程序的五大内存分区实例详解

    当我们编写C++程序时,系统会默认给程序分配内存,这些内存被分为五个不同的区域,每个区域用途不同,下面我们来详细介绍一下这五个区域的作用。 代码区(文字常量区) 代码区主要用来存放程序的执行代码,这部分内存是只读的,并且在程序启动时就已经固定分配好了。在一个C++程序中,所有的函数、语句都被转换成了二进制码,并被存储在代码区中。代码区还包括存储在程序中的字符…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部