linux 自己编写的程序,Linux write指令的代码实现(自己编写实现)

系统:ubuntu10.10

实验题目: 编写⼀个 write 简单版本,能够接受用户名作为参数,并 在屏幕上显示你想通信

的用户。查看 write 的标准版本显示的内容。 你的程序应该可以处理这样的特殊情况:你想

聊天的人可能没有登录。另⼀方 面,你想聊天的人可能登录了若干个终端。

解决过程:

记得当时安装虚拟系统时,只设定了一个用户,为了做这个实验我必须添加几个用户。如果你系统中已经有多个用户可以省略这一步。

step1、建立多个用户

建立用户的命令为:sudo useradd -d /usr/sam -m sam

建立一个名字叫sam的用户,使用sudo是因为权限不够,必须在root下才能使用useradd,所以在非root下必须添上sudo。注意这时你还不能使用这个用户名登陆,为什么?因为你还没给他授权啊!怎么授权,很简单,给他个密码就得了。

给新建的用户添加密码:sudo passwd sam

然后根据提示输入新密码。

至此用户创建完毕,你可以switch user试试成功没有。

step2、通过用户名找到所在的终端

思路是从utmp文件中根据用户名进行搜索,找到和目的用户名相同的记录,并保存。注意满足条件的记录可能有多条,因为那个用户可能打开了多个终端。所以我们得用一个数组存储。这个数组只要存储tty名字就行了。下面就是这个函数的代码。

char **

get_tty( char *logname )

/*

* purpose: find the tty at which 'logname' is logged in

* returns: a string or NULL if not logged in

* errors: does not handle multiple logins

*/

{

static struct utmp utrec[MAX];/* set static because retval is a local value */

int utfd;

int namelen = sizeof( utrec[0].ut_name );

char *retval[MAX] = {NULL} ;

int index = 0;

if ( (utfd = open( UTMP_FILE, O_RDONLY )) == -1 ) /* open utmp */

return NULL;

/* look for a line where the user is logged in */

while( read( utfd, &utrec[index], sizeof(struct utmp)) == sizeof(struct utmp) )

if ( strncmp(logname, utrec[index].ut_name, namelen ) == 0 )/* */

{

retval[index++] = utrec[index].ut_line ;

}

close(utfd); /* close & go */

return retval;

}

step3、通过向目标tty文件写入数据来达到聊天的目的

通过步骤2我们已经通过用户名获得了终端文件名。根据这个终端文件名我们就可以进行聊天了。上面提到了一个用户可能会打开多个终端,所以会有多个终端名,注意要有提醒用户做出选择的代码。接下来主要讲讲如何向对方的终端文件写入数据来达到聊天的目的。

假设tty_name是用户的打开的某个终端的文件名,首先打开这个终端文件:

sprintf(buf, "/dev/%s", tty_name);

fd = open( buf, O_WRONLY );

打开后就可以从键盘中读入,并把内容发送给对方:

while( fgets(buf, BUFSIZ, stdin) != NULL ){ /* write to user */

if ( write(fd, buf, strlen(buf)) == -1 )

break;

}

到此,核心部分都已经描述清楚了。剩下的就是添砖加瓦,直到满足题目需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例程序,它使用MOV指令从寄存器中加载x、y、z的值,并计算公式(x y)² - z的结果。 ``` section .data x db 4 y db 6 z db 2 section .text global _start _start: mov eax, [x] ; load x into eax mov ebx, [y] ; load y into ebx imul eax, ebx ; multiply x and y mov ecx, eax ; save the result in ecx add eax, ecx ; add the result to itself sub eax, [z] ; subtract z from the result ; print the result mov ebx, 1 ; file descriptor for stdout mov ecx, eax ; value to print mov edx, 1 ; length of value mov eax, 4 ; system call for write int 0x80 ; invoke the system call ; exit the program mov eax, 1 ; system call for exit xor ebx, ebx ; exit code int 0x80 ; invoke the system call ``` 该程序首先声明了三个变量x、y、z,并将它们初始化为4、6和2。然后,在_start标签下,程序使用MOV指令将x和y的值加载到寄存器eax和ebx中。接下来,程序使用IMUL指令将eax和ebx中的值相乘,并将结果保存在ecx中。然后,程序使用ADD指令将eax的值加上ecx的值,从而得到公式(x y)²的结果。最后,程序使用SUB指令将eax的值减去z的值,得到最终的结果。 程序的最后一段使用了系统调用来将结果打印到控制台,并退出程序。具体来说,程序使用MOV指令将stdout的文件描述符1加载到ebx中,将计算结果加载到ecx中,将要打印的字符数1加载到edx中,使用系统调用4来调用write函数,将结果打印到控制台上。然后,程序使用MOV指令将退出代码0加载到ebx中,使用系统调用1来调用exit函数,退出程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值