目录
前言
上篇博客对C/C++进程的中部分进行了详细讲解,本篇博客将继续讲解和补充关于线程的知识点。
一,有名管道通信
1 .概念
2 .创建有名管道
实例代码如下:
//从管道读10个整数,然后排序,并打印
int main(int argc ,char **argv)
{
int fd;
int a[10],i,j,flag;
if(argc != 2){
fprintf(stderr,"Usage: %s <fifoname>\n",argv[0]);
exit(1);
}
//判断管道文件是否存在,如果不存在则创建,存在则直接打开
if(access(argv[1],F_OK)){
//创建有名管道
if(mkfifo(argv[1],0666) < 0){ //管道权限= 0666 & ~umusk
perror("mkfifo");
exit(1);
}
}
//打开管道
if((fd = open(argv[1],O_RDWR)) < 0){
perror("open");
exit(1);
}
//从管道中读10个整数
if(read(fd,a,sizeof(a)) < 0){
perror("read");
exit(1);
}
//排序
for(i = 0; i < 9; i++){
flag = 1;
for(j = 0; j < 9-i; j++)
if(a[j] > a[j+1]){
a[j] = a[j] + a[j+1];
a[j+1] = a[j] - a[j+1];
a[j] = a[j] - a[j+1];
flag = 0;
}
if(flag)
break;
}
for(i = 0; i < 10; i++){
printf("%d ",a[i]);
fflush(stdout);
sleep(1);
}
printf("\n");
close(fd);
return 0;
}
//从键盘输入10个整数,并写入管道
int main(int argc ,char **argv)
{
int fd;
int a[10],i;
if(argc != 2){
fprintf(stderr,"Usage: %s <fifoname>\n",argv[0]);
exit(1);
}
//判断管道文件是否存在,如果不存在则创建,存在则直接打开
if(access(argv[1],F_OK)){
//创建有名管道
if(mkfifo(argv[1],0666) < 0){ //管道权限= 0666 & ~umusk
perror("mkfifo");
exit(1);
}
}
//打开管道
if((fd = open(argv[1],O_RDWR)) < 0){
perror("open");
exit(1);
}
//键盘输入10个整数
printf("请输入10个整数:");
for(i = 0; i < 10; i++){
scanf("%d",&a[i]);
}
//向管道中写10个整数
write(fd,a,sizeof(a));
close(fd);
return 0;
}
二、信号通信
1 .概念
2 .用户进程对信号的响应方式
3. 用户进程对常用信号的缺省操作
4. 信号处理流程
5. 信号相关函数(系统调用)
5.1 kill - 给指定进程发送信号
实例代码如下:
int main(int argc,char **argv)
{
#if 1
pid_t pid;
if(argc != 2){
fprintf(stderr,"Usage: %s <pid>\n",argv[0]);
exit(1);
}
pid = atoi(argv[1]); //atoi将字符串转为整数
if(kill(pid,SIGKILL) < 0){
perror("kill");
exit(1);
}
#else
pid_t pid1,pid2;
int i;
if((pid1 = fork()) < 0){
perror("fork");
exit(1);
}else if(!pid1){ //子进程1
for(i = 0; ; i++){
printf("pid = %d\n",getpid());
sleep(1);
}
}else{
if((pid2 = fork()) < 0){
perror("fork");
exit(1);
}else if(!pid2){ //子进程2
for(i = 0; ; i++){
printf("pid = %d\n",getpid());
sleep(1);
}
}else{ //父进程
for(i = 0; ; i++){
printf("pid = %d\n",getpid());
sleep(1);
if(i == 5)
//kill(0,SIGKILL); //0--给进程组中每一个进程发送信号
kill(pid2,SIGKILL); //给pid2发送信号
}
}
}
#endif
return 0;
}
5.2 raise() --给当前进程发送信号
实例代码如下:
int main(void)
{
int i;
for(i = 0; ; i++){
printf("pid = %d\n",getpid());
sleep(1);
if(i == 7)
raise(SIGKILL);
}
return 0;
}
5.3 alarm() 在进程中设置定时器(闹钟)
实例代码如下:
int main(void)
{
int i,ret;
ret = alarm(20); // 从该语句开始计时,7秒之后发送SIGALRM信号给当前进程
printf("ret = %d\n",ret);
for(i = 0; ; i++){
printf("pid = %d,i = %d\n",getpid(),i);
sleep(1);
if(i == 7){
ret = alarm(5);
printf("ret = %d\n",ret);
}
}
return 0;
}
5.4 pause() 使进程挂起
实例代码如下:
//信号处理函数
void fun(int signo)
{
int i;
for(i = 0; i < 3; i++){
printf(GREEN "正在吃饭\n"NONE);
sleep(1);
}
}
int main(void)
{
int i,j;
//注册信号SIGALRM
signal(SIGINT,fun);
for(i = 0; ; i++){
pause(); //使进程挂起,直到收到信号为止
for(j = 0; j < 5; j++){
printf("正在睡觉\n");
sleep(1);
}
}
return 0;
}
5.5 signal 注册信号
实例代码如下:
//信号处理函数
void eat(int signo)
{
int i;
for(i = 0; i < 3; i++){
printf(GREEN "正在吃饭\n"NONE);
sleep(1);
}
}
int main(void)
{
int i;
//注册信号SIGALRM
signal(SIGALRM,eat);
for(i = 0; ; i++){
if(i % 8 == 0){
alarm(8); // 从该语句开始计时,7秒之后发送SIGALRM信号给当前进程
printf("开始睡觉,设置闹钟\n");
}
printf("正在睡觉......\n");
sleep(1);
}
return 0;
}
总结
本篇文章针对进程进行最后的超详细讲解和补充,希望能够帮到大家!
以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王!
希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们!