V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lolcat
V2EX  ›  程序员

Linux 应用层开发,面试一般会问哪些问题?

  •  
  •   lolcat · 2018-09-15 15:10:10 +08:00 · 3965 次点击
    这是一个创建于 2048 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主前段时间报了培训班学了嵌入式开发.

    我知道有很多人对培训班出来的有很大意见,比如伪造简历,吹得天花乱坠却连计算机基础知识都不知道,我在培训班里看到有些同学学的非常差和老师叫我们包装简历时也能感受到这种行为对这个行业的破坏.但我大学专业就是计算机科学与技术,虽然有些科目没怎么学,但自己感兴趣的科目还是学的非常好的,而且我工作后就一直从事 linux 方面的工作,c 基础也非常好.我写简历就是实话实说,有什么写什么.

    linux 应用层开发的面试,面试官一般会问哪些具体的问题?会问我一些函数的各个参数吗?有些函数的参数我记不住了,但原理清楚,参数必须看手册和笔记我才能想起来.

    我以前没什么开发的项目经验,不过 shell 脚本和 c 的小程序第一份工作时也经常写,我自己写了两个应用层的程序,一个用高级 io+多线程实现的数据处理程序,另外一个用了很多零零碎碎的知识做了一个和同学开玩笑的程序,不知道能不能写到简历上,两个程序的代码如下: https://github.com/owlli/epoll_pthread https://github.com/owlli/trick

    29 条回复    2018-09-17 07:23:38 +08:00
    lovefantasy
        1
    lovefantasy  
       2018-09-15 15:27:36 +08:00 via Android
    我觉得不行
    AngelCriss
        2
    AngelCriss  
       2018-09-15 15:29:54 +08:00 via Android
    看了下你那个 server.c,既然用了事件循环,为啥还要为每一个连接新开一个线程?
    inoki
        3
    inoki  
       2018-09-15 15:30:02 +08:00 via Android
    算法+数据结构
    AngelCriss
        4
    AngelCriss  
       2018-09-15 15:31:07 +08:00 via Android
    @lovefantasy 我也觉得不行。。
    lolcat
        5
    lolcat  
    OP
       2018-09-15 15:40:01 +08:00
    @lovefantasy 能给出一点求职建议吗?谢谢.
    lolcat
        6
    lolcat  
    OP
       2018-09-15 15:45:45 +08:00
    @AngelCriss 让新线程处理客户端发送过来的数据啊,我这里的处理方法只是把数据打印出来,如果其他处理方法,可能会处理很久,我不能让进程一直阻塞在那啊
    AngelCriss
        7
    AngelCriss  
       2018-09-15 16:04:57 +08:00
    @lolcat
    如果你的任务不是 CPU 密集的,比如死循环,就没有必要这么做。
    你可以把这些连接设置成非阻塞的加到事件循环里面,每个链接绑定一个回调,如果只是 ping/pong 这种,每次可读或可写的时候就执行这个回调就行了,如果有上下文,还需要和这个连接绑定。
    这是一个很基础很常见的模型。
    lolcat
        8
    lolcat  
    OP
       2018-09-15 17:58:36 +08:00
    @AngelCriss 假如我需要把接受到的数据存到数据库,数据库非常慢,插入一次数据要 1 秒,如果不用多线程,我那 1 秒不就阻塞了吗?
    xeaglex
        9
    xeaglex  
       2018-09-15 18:16:30 +08:00
    楼主,他说的是非阻塞模型,实现原理上也是利用多线程,但效率比你的高。
    lolcat
        10
    lolcat  
    OP
       2018-09-15 18:30:00 +08:00
    @xeaglex 还是不太理解
    @AngelCriss 说的模式,我也是用的非阻塞模型啊,能详细介绍下吗?我的是一旦 bind 的 socket 可读,就取出连接队列里的 socket 并加入 epoll 监视队列,如果是新建的 socket 可读,就新建新线程从这个 socket 里读数据
    qwertyssp
        11
    qwertyssp  
       2018-09-15 18:40:36 +08:00 via Android
    啥也不会问,就问以前做过什么
    meik2333
        12
    meik2333  
       2018-09-15 18:49:16 +08:00
    读写的事件也可以扔 epoll 跑的,读写事件是交给内核处理的,这些时间程序是可以利用起来的。
    AngelCriss
        13
    AngelCriss  
       2018-09-15 18:59:14 +08:00 via Android   ❤️ 1
    @lolcat 刚好之前有写过个,你可以看看
    https://isliberty.me/tmp/tmp.txt
    xvrzhao
        14
    xvrzhao  
       2018-09-15 19:47:02 +08:00
    @lolcat 可以参考一下 libuv 的设计,https://libuv.org
    lolcat
        15
    lolcat  
    OP
       2018-09-15 23:46:19 +08:00
    @AngelCriss 非常感谢.但是我 c++语法不是太懂,不过还是把程序大致架构看懂了.你是将新建的 socket 放到线程里用 epoll 监控吗?我是把新建的 socket 添加到进程的 epoll 队列里监控,这应该是我俩程序最大的不同吧?
    你的程序倒数 17 行,应该可以不用 for 循环吧?因为 epoll 默认工作在 lt 模式,在 lt 模式下,只要监控的文件描述符为可读,epoll_wait 就会一直触发.
    lolcat
        16
    lolcat  
    OP
       2018-09-15 23:47:50 +08:00
    @meik2333 你说的是将 accept 后得到的 socket 放进程里用 epoll 监视吗?
    AngelCriss
        17
    AngelCriss  
       2018-09-16 00:01:41 +08:00 via Android
    @lolcat 不好意思,你这 3 个问号的回答都是否定的。
    回到正题,这个帖子的回答就是 3 楼说的。另外,楼主可能需要系统的学习下网络编程,而不是只知道系统调用怎么用就行。
    lolcat
        18
    lolcat  
    OP
       2018-09-16 00:11:51 +08:00
    @AngelCriss 请问能简单介绍下你是如何监视 accept 后得到的套接字吗?我非常想把自己写的程序优化下,谢谢.
    jedihy
        19
    jedihy  
       2018-09-16 00:35:08 +08:00 via iPhone
    @lolcat 可读就把这个 buffer 读了直到返回 ewouldblock,再加入 epoll
    jedihy
        20
    jedihy  
       2018-09-16 00:36:22 +08:00 via iPhone
    @lolcat 回错楼了
    realpg
        21
    realpg  
       2018-09-16 09:42:47 +08:00
    报了培训班 即使科班出身 也基本定调了 感觉写不出靠谱代码的……
    根本心不在此 舍不得自己钻研 走自认的捷径培训班
    meik2333
        22
    meik2333  
       2018-09-16 09:47:11 +08:00
    @lolcat 嗯,把 accept 之后的套接字也加入 epoll 监听。
    lolcat
        23
    lolcat  
    OP
       2018-09-16 12:45:24 +08:00
    @meik2333 嗯,我是把 accept 得到的 socket 加入到进程的 epoll 队列里监听,有人是把 accept 得到的 socket 传到线程里,在线程里用 epoll 监听,您觉得哪种方式好?
    meik2333
        24
    meik2333  
       2018-09-16 14:37:54 +08:00   ❤️ 1
    @lolcat 各有优劣吧,这个就看自己的写法了。
    我个人比较喜欢全给 epoll 监听,就像 Nginx 一样。
    neoblackcap
        25
    neoblackcap  
       2018-09-16 20:08:14 +08:00
    @meik2333 nginx 我看了可是 One thread one loop。虽然都是 epoll,但是 worker 的 epoll 跟 master 的 epoll 不是一个实例
    meik2333
        26
    meik2333  
       2018-09-16 22:02:07 +08:00
    @neoblackcap 我并没有实际看过 Nginx 的源码,只是看过《深入理解 Nginx 》,所以可能有误差,不好意思了。
    我之前看的 Nginx 的模型是父进程 listen,然后将套接字传给子进程;对每个子进程来说,accept 或者 read、write 等都是添加到 epoll 监听的。
    我之前还看到在某些系统上 Nginx 采用的是线程模型,对于那些我也没有了解。不管怎样,还是感谢指正了。
    neoblackcap
        27
    neoblackcap  
       2018-09-16 22:48:34 +08:00
    @meik2333 你说的就是我说的,每个线程独自有一个 epoll 实例。你 master 里面的 epoll 监听的事件,是不会触发 worker 的 callback 的。意思就是这个意思。
    这个我也是从陈硕的《 Linux 多线程服务端编程》里面看到的。加上自己看过一下 nginx 早期版本的代码。处理好网络 IO 剩下就是本地磁盘 IO 这些,这个 nginx 优化还真是厉害
    zeromake
        28
    zeromake  
       2018-09-17 07:18:02 +08:00 via Android
    话说嵌入式没工作经验怎么找工作?
    zeromake
        29
    zeromake  
       2018-09-17 07:23:38 +08:00 via Android
    话说两年前我是培训的,当时和朋友聊天说到那个培训机构里还有 3,4 个培训嵌入式的培训完大半年还没找到工作的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2572 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:03 · PVG 00:03 · LAX 09:03 · JFK 12:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.