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技术站