Linux期末考试模拟题
一、选择题
-
将当前目录下的test文件移动到父目录中,正确的命令是
-
查看Linux系统中正在运行的进程信息,应该使用( ps )命令。
-
终止当前正在运行的程序可以使用( ctrl+c )快捷键。
-
SOCKET网络通信中不会在SERVER端调用的函数是( D )。
A. bind B. listen C. accept D. connect
- Linux中使用( socket() )函数创建SOCKET对象。
- 已知变量定义如下: FILE *fp; 以下语句正确的是( B )。
A. fread(fp, “test”); B. fprintf(fp, “test”);
C. fclose(fp, “test”); D. fwrite(fp, “test”);
- Linux中将字符串“192.168.1.1”转换成IP地址类型数据的函数是( inet_addr )。
二、简答题
-
简述SOCKET编程中bind、listen和accept函数的作用
bind函数: 用于将套接字与指定端口相连.本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
Listen 函数: listen函数可使得流套接字sockfd处于监听状态,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。
Accept 函数: 它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户程序就可以与自己的客户进行点到点的通信了。
-
对比说明Linux编程中多进程和多线程的特点
随便找的,答案待定
进程是分配系统资源基本实体,线程是CPU调度的基本单位"
1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1。速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内 -
简要说明函数fgets、fputs、fread和fwrite各自参数、返回值的类型和作用
char * fgets(char *s, int n, FILE *stream);
参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。
流中读取n-1(n默认1024)个字符之前,如遇到了换行符或EOF
int fputs(char *string, FILE *stream);
送一个字符串到一个流中。
fread(buffer,size,count,fp);
buff表示存放输入数据的首地址,
size 表示数据块的字节数。
count 表示要读写的数据块块数。
fp 表示文件指针
fwrite(buffer,size,count,fp);
buff表示存放输入数据的首地址
size 表示数据块的字节数。
count 表示要读写的数据块块数。
fp 表示文件指针
-
简要介绍Linux多线程pthread库中互斥量(mutex)的使用方式
Linux中提供一把互斥锁mutex
每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。
但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了
pthread_mutex_init()函数 功能:初始化一个互斥锁
pthread_mutex_destroy()函数 功能:销毁一个互斥锁
pthread_mutex_lock()函数 功能:加锁
pthread_mutex_trylock()函数 功能:尝试加锁
pthread_mutex_unlock()函数 功能:解锁
三、程序设计题
- 使用C语言编写程序实现:将文本文件/var/message复制到/home/test/message,并在每行文本前加上行号。
#include<stdio.h>
int main(){
FILE *fpIn;
FILE *fpOut;
char str[120];
int row;
fpIn = fopen("/var/message","r");
fpOut = fopen("/home/test/message","w");
fgets(str,81,fpIn);
while (!feof(fpIn))
{
fprintf(fpOut,"%04d %s\n",row,str);
row++;
fgets(str,81,fpIn);
}
fclose(fpIn);
fclose(fpOut);
}
2.使用多进程编程完成以下功能:
(1)定义长度为10的整型数组全局变量;
(2)主函数创建子线程;
(3)主函数中每隔1秒将产生一个随机数,依次放入数组中,共执行10次;
(4)子线程中,每隔2秒从数组中依次取出一个数显示,共显示10个数字。
(5)使用互斥量(mutex)保证对全局数据的互斥操作
(6)主函数等待子线程结束后退出。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex;
int r[10];
void *child_proc()
{ int i;
for (i = 0; i < 10; i++)
{
pthread_mutex_lock(&mutex);
printf("%d子:%d\n",i, r[i]);
pthread_mutex_unlock(&mutex);
sleep(2);
}
return NULL;
}
int main()
{
int i;
pthread_t tid;
pthread_mutex_init(&mutex,NULL);
pthread_create(&tid, NULL, &child_proc,NULL);
for (i = 0; i < 10; i++)
{
int a = rand();
pthread_mutex_lock(&mutex);
r[i] = a;
printf("主:%d\n",a);
pthread_mutex_unlock(&mutex);
sleep(1);
}
pthread_join(tid, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
3.socket编程(预测,不一定考)
client端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int cfp;
struct sockaddr_in saddr;
int sin_size,ret;
cfp=socket(AF_INET,SOCK_STREAM,0);
if (cfp==-1)
{
printf("socket error");
return -1;
}
bzero(&saddr,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr =inet_addr("127.0.0.1");
saddr.sin_port=htons(0x5555);
ret =connect(cfp, (struct sockaddr *)&saddr,sizeof(struct sockaddr));
if(ret == -1){
printf("connect error");
close(cfp);
return -1;
}
send(cfp,"Hello I am client",sizeof("Hello I am client"),0);
close(cfp);
return 0;
}
server端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
void *child_proc(void *arg){
int nfp=(int *)arg;
char buf[256];
int ret;
while(1){
bzero(buf,sizeof(buf));
ret=recv(nfp,buf,sizeof(buf),0);
if(ret== -1){
printf("recv error\n");
break;
}
printf("recv :%s\n",buf);
if(strcmp(buf,"over")==0){
printf("client close");
break;
}
}
close(nfp);
return NULL;
}
int main()
{
int sfp, nfp;
int ret;
int sin_size;
pthread_t tid;
struct sockaddr_in saddr, caddr;
printf("server start..");
sfp = socket(AF_INET, SOCK_STREAM, 0);
if (sfp == -1)
{
printf("error");
return -1;
}
bzero(&saddr, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = htons(0x5555);
ret = bind(sfp, (struct sockaddr *)&saddr, sizeof(struct sockaddr));
if (ret == -1)
{
printf("bind error\n");
close(sfp);
return -1;
}
ret = listen(sfp, 5);
if (ret == -1)
{
printf("listen error\n");
close(sfp);
return -1;
}
while (1)
{
printf("wait connect...\n");
sin_size = sizeof(struct sockaddr_in);
nfp = accept(sfp, (struct sockaddr *)&caddr, &sin_size);
pthread_create(&tid,NULL,&child_proc,(void*)nfp);
}
return 0;
}