Linux笔试题

1. 程序代码如下,请按执行顺序写出输出结果: 

int main()
{  pid_t  pid1,pid2;
  
   if((pid1=fork()) = = 0)
{
   sleep(3);
   printf(“info1 from child process_1\n”);
   exit(0);
   printf(“info2 from child process_1\n”);
}
else
{
  if((pid2=fork()) = = 0)
  {
     sleep(1);
     printf(“info1 from child process_2\n”);
     exit(0);
  }
  else
  {
     wait(NULL);
     wait(NULL);
     printf(“info1 from parent process\n”);
     printf(“info2 from parent process”);
     _exit(0);
  }
}  

 运行结果:

linux@linux:/mnt/hgfs/linuxshare/linux_code/test$ ./test01
info1 from child process_2
info1 from child process_1
info1 from parent process

为什么不打印   printf(“info2 from parent process”);????

在C语言中,printf函数通常在输出完内容后会等待标准输出缓冲区刷新,以确保内容被正确地输出到屏幕上。

但是,在程序执行结束时,标准输出缓冲区不会自动刷新。

因此,如果在printf之后没有添加换行符\n,而是直接调用exit或_exit来退出程序,可能会导致输出被缓冲,而没有立即被打印到屏幕上。

当你在printf("info2 from parent process\n");之后加上\n时,会强制刷新标准输出缓冲区,使得之前的内容立即被输出到屏幕上。

而当你没有加上\n时,程序可能会在调用exit或_exit之前退出,导致缓冲区中的内容没有被输出。

因此,为了确保printf的输出能够立即被打印到屏幕上,建议在printf的最后添加换行符\n。

 2. 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

write(1,"A",1);:

        这行代码使用 write 函数将字符 'A' 写入文件描述符为1的位置。在UNIX系统中,文件描述符1通常是标准输出(stdout),所以这行代码将字符 'A' 写入到标准输出中,即将字符 'A' 打印到控制台上。

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<signal.h>
#include<fcntl.h>

sem_t sem[3];
char* shmaddr;

void semdestroyhandle(int sig)
{
	sem_destroy(&sem[0]);
	sem_destroy(&sem[1]);
	sem_destroy(&sem[2]);
	exit(0);
}

void* func1(void* arg)
{
	while(1)
	{
		sem_wait(&sem[0]);
		write(1,"A",1);
		sem_post(&sem[1]);
	}
}

void* func2(void* arg)
{
	while(1)
	{
		sem_wait(&sem[1]);
		write(1,"B",1);
		sem_post(&sem[2]);

	}
}

void* func3(void* arg)
{
	while(1)
	{
		sem_wait(&sem[2]);
		write(1,"C",1);
		sleep(3);
		sem_post(&sem[0]);
	}
}

struct sigaction oldact;
int main()
{	
	struct sigaction act;
	act.sa_handler = semdestroyhandle;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);
	sigaction(SIGINT,&act,&oldact);

	pthread_t tid[3];


	

	sem_init(&sem[0],0,1);
	sem_init(&sem[1],0,0);
	sem_init(&sem[2],0,0);

	pthread_create(&tid[0],NULL,func1,NULL);
	pthread_create(&tid[1],NULL,func2,NULL);
	pthread_create(&tid[2],NULL,func3,NULL);

	pthread_join(tid[0],NULL);
	pthread_join(tid[1],NULL);
	pthread_join(tid[2],NULL);



	return 0;
}

 运行结果:

linux@linux:/mnt/hgfs/linuxshare/linux_code/test$ ./test02
ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC^Clinux@linux:/mnt/hgfs/linuxshare/linux_code/test$ 

3. 编写程序实现如下功能

reader.c     从argv[1]所指定的文件中读取内容,依次写到管道/home/linux/myfifo中

writer.c     从管道/home/linux/myfifo中读取内容,写到argv[1]所指定的文件中并保存 

代码中可省略头文件,/home/linux/myfifo无需创建

在linux下关于int main( int argc, char* argv[] )含义解析及调试_linuxc int main int argc-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_43053387/article/details/88034871

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main(int argc,const char* argv[])
{
	if(argc != 2)
	{
		printf("%s filename\n",argv[0]);
		exit(1);
	}

	int fd = open(argv[1],O_RDONLY);
	if(fd < 0)
	{
		perror("open");
		return 0;
	}

	int fifo_fd = open("/home/linux/myfifo",O_WRONLY);
	if(fifo_fd < 0)
	{
		perror("open");
		return 0;
	}
	
	char buf[1024];
	int n;
	while((n = read(fd,buf,sizeof(buf))) > 0)
	{
		write(fifo_fd,buf,n);
	}

	close(fd);
	close(fifo_fd);

	return 0;

}

要查看命名管道中的内容,您可以使用命令行工具来读取管道,并将其内容输出到终端。 


这里有几种方法可以实现:

使用 cat 命令:
您可以使用 cat 命令将管道中的内容输出到终端。例如:

cat /home/linux/myfifo
这将显示 /home/linux/myfifo 管道中的内容。

使用 less 或 more 命令:
您可以使用 less 或 more 命令逐页查看管道中的内容。例如:

less /home/linux/myfifo
或者
more /home/linux/myfifo
您可以使用键盘上的箭头键或空格键来滚动内容。

使用 tail 命令:
您可以使用 tail 命令查看管道中最新添加的内容。例如:

tail -f /home/linux/myfifo
-f 选项将使 tail 命令保持打开状态,并在管道中有新内容时实时显示。

 执行以下操作来查找文件:

在当前目录中查找: 如果您不记得将 example.txt 放在了哪里,可以在当前目录中执行以下命令来查找:

ls -l example.txt
这将列出当前目录中的所有文件及其属性。如果 example.txt 存在于当前目录中,它将显示在列表中。

在其他目录中查找: 如果您认为 example.txt 可能存储在其他目录中,您可以使用 cd 命令更改目录,然后使用 ls 命令查找。例如:

cd /path/to/directory
ls -l example.txt
这将更改到指定目录并列出该目录中的文件。如果找到了 example.txt 文件,它将显示在列表中。

使用搜索工具: 如果您对文件的位置毫无线索,您可以使用搜索工具,如 find 命令。例如:

find / -name "example.txt"
这将从根目录开始搜索整个文件系统,查找名为 example.txt 的文件,并显示它们的路径。

通过这些方法之一,您应该能够找到 example.txt 文件的位置。
linux@linux:~$ sudo find / -name 1.txt
[sudo] password for linux: 
/mnt/hgfs/linuxshare/linux_code/test/1.txt
/home/linux/code_Linux/code_2024_1_26/1.txt
/home/linux/code_Linux/code_2024_1_25/1.txt

linux@linux:~$ cd /mnt/hgfs/linuxshare/linux_code/test
linux@linux:/mnt/hgfs/linuxshare/linux_code/test$ ls -l 1.txt
-rwxrwxrwx 1 root root 138 Mar 20 02:44 1.txt
linux@linux:/mnt/hgfs/linuxshare/linux_code/test$ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474266.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

力扣刷题-砖墙题554

砖墙题 这题一开始没有想到思路&#xff0c;一开始还想着用枚举法做/笑哭 后来看了题解&#xff0c;原来就是哈希表的题目呀。 说到哈希表&#xff0c;这里有个八股需要记一下&#xff1a; HashMap和HashTable的区别 线程是否安全&#xff1a;HashMap线程不安全 HashTable线…

[综述笔记]Flexible large-scale fMRI analysis: A survey

论文网址&#xff1a;Flexible large-scale fMRI analysis: A survey | IEEE Conference Publication | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff0…

力扣热门算法题 56. 合并区间,57. 插入区间,58. 最后一个单词的长度v

56. 合并区间&#xff0c;57. 插入区间&#xff0c;58. 最后一个单词的长度&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 56. 合并区间 解题思路 完整代码 Python Java ​编辑 5…

【自然语言处理】NLP入门(八):1、正则表达式与Python中的实现(8):正则表达式元字符:.、[]、^、$、*、+、?、{m,n}

文章目录 一、前言二、正则表达式与Python中的实现1、字符串构造2、字符串截取3、字符串格式化输出4、字符转义符5、字符串常用函数6、字符串常用方法7、正则表达式1. .&#xff1a;表示除换行符以外的任意字符2. []&#xff1a;指定字符集3. ^ &#xff1a;匹配行首&#xff0…

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题&#xff0c;原本打算在代码中自己写一个类去管理将打印信息收集到log日志中&#xff0c;忽然想到&#xff0c;其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test&#xff0c;并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…

基于Java中的SSM框架实现高校毕业设计管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校毕业设计管理系统演示 摘要 现代学校的教学规模逐渐增加&#xff0c;需要处理的信息量也在增加。每年毕业&#xff0c;将会有大量的毕业设计要处理。传统的毕业设计管理方法已不能满足师生的需求。教师和学生需要一个简单方便的系统来取代传统的机…

FPGA学习_Xilinx7系列FPGA基本结构

文章目录 前言一、7系列FPGA介绍1.1、芯片编号 二、基本组成单元2.1、可编程逻辑块CLB&#xff08;Configable Logic Block&#xff09;2.2、可编程输入输出单元&#xff08;IOB&#xff09;2.3、嵌入式块RAM&#xff08;Block RAM&#xff09;2.4、底层内嵌功能单元2.5、内嵌专…

【2】华为交换机如何修改Web登录密码?

0x01 问题描述 如果忘记了Web登录密码或者希望修改Web登录密码&#xff0c;用户可以通过Console口、STelnet或Tenet等方式登录交换机后设置新的Web登录密码。 使用Telnet协议存在安全风险&#xff0c;建议使用Console囗或STelnet V2登录设备 0x02 问题解决 <HUAWEI> s…

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…

线段树优化dp

abc339 E - Smooth Subsequence 思路&#xff1a;我们很容想到一个 n n n方的的状态转移方程&#xff0c;即对于每个i&#xff0c;我们去枚举 1 1 1到 i − 1 i-1 i−1的状态&#xff0c;即 d p [ i ] m a x ( d p [ i ] , d p [ j ] 1 ) ; dp[i]max(dp[i],dp[j]1); dp[i]ma…

Vue字符串里的中文数字转换为阿拉伯数字

js字符串里的中文数字转换为数字 <template><view><view><view class"inpbox" ><textarea v-model"voiceMane" input"convert" ></textarea></view></view></view> </template> &…

3.7 RK3399项目开发实录-板载OpenWRT系统的使用(wulianjishu666)

STM32F103单片机从零到项目开发程序实例 下载链接&#xff1a;https://pan.baidu.com/s/1dWNskNinrMk4bxaE-jgHhQ?pwdymn3 1. OpenWRT 手册 1.1. 支持设备列表 主控板卡型号RK3568ROC-RK3568-PC/Station-P2 1.2. 登录 IP 、登录密码和 WIFI 名称 固件默认登录 IP 为 192.1…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…

序列化与反序列化介绍

文章目录 一、序列化与反序列化二、PHP反序列化漏洞成因三、JAVA反序列化 一、序列化与反序列化 在PHP语言开发层面上基本都是围绕着serialize()&#xff0c;unserialize()这两个函数。serialize()函数序列化对象后&#xff0c;可以很方便的将它传递给其他需要它的地方&#x…

由浅到深认识Java语言(9):Eclipse IDE简介

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 &#xff08;1&#xff09;蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成&#xff0c;而蜂鸣器又分为无源他激型与有源自激型&#xff0c;蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是&#xff1a;方波信号输入谐振装置转换为声…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型&#xff1a;链表、二叉树的遍历 链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

ES集群不识别节点SSL证书的问题处理

问题描述 在启动ES服务并试图加入其他节点上已启动的集群时&#xff0c;出现报错(原文是一大段话&#xff0c;我按语义拆成了几段)&#xff1a; [2024-03-19T16:32:02,844][WARN ][o.e.c.s.DiagnosticTrustManager] [node-2-master] failed to establish trust with server a…