clion wsl

clion新版开始支持wsl,这样就可以很方便的直接在windows上编译linux特性的C代码。

Bash on Windows

  • 在控制面板\程序\程序和功能 启用或关闭 Windows 功能中勾选 适用于 Linux 的 Windows 子系统
  • 在设置中打开开发人员模式
  • 重启后powershell输入
lxrun /install /y
  • 命令行直接输入bash就可以启动了

ubuntu on windows

microsoft store 直接安装ubuntu子系统

  • 重装openssh
sudo apt-get remove openssh-server
sudo apt-get install openssh-server
  • 修改sshd设置
    vim /etc/ssh/sshd_config
UsePrivilegeSeparation no
PasswordAuthentication yes
ListenAddress 0.0.0.0
  • 重启sshd
sudo service ssh --full-restart

可能的问题

sshd ../sysdeps/posix/getaddrinfo.c:2603: getaddrinfo: Assertion IN6_IS_ADDR_V4MAPPED (sin6->sin6_addr.s6_addr32) failed.

自启动ssh

一旦bash进程被关闭,ssh就无法连接:

  • 添加启动项,让bash开机自启
  • 使用sudo service ssh start启动需要输入密码所以需要visudo免密码操作

具体操作:

  • 使用vbs启动bash并运行sudo service ssh start
set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe",0
ws.run "C:\Windows\System32\bash.exe  -c 'sudo /usr/sbin/service ssh start'",0

其他启动项类似也可以加在脚本后面,把vbs文件放入如下目录:

%AppData%\Microsoft\Windows\Start Menu\Programs\Startup
  • 运行sudo visudo,添加配置
    username ALL = (root) NOPASSWD: /usr/sbin/service
    

愉快的写linux c吧

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>

pthread_t main_tid;

void print_ids(const char *str) {
    pid_t pid;      //进程id
    pthread_t tid;  //线程id
    pid = getpid();       //获取当前进程id
    tid = pthread_self(); //获取当前线程id
    printf("%s pid: %u tid: %u (0x%x)\n",
           str, (unsigned int) pid, (unsigned int) tid, (unsigned int) tid);
}

void *func(void *arg) {
    print_ids("new  thread:");
    return ((void *) 0);
}

int main() {
    int err;
    err = pthread_create(&main_tid, NULL, func, NULL); //创建线程
    if (err != 0) {
        printf("create thread error: %s/n", strerror(err));
        return 1;
    }
    printf("main thread: pid: %u tid: %u (0x%x)\n",
           (unsigned int) getpid(),
           (unsigned int) pthread_self(),
           (unsigned int) pthread_self());
    print_ids("main thread:");
    sleep(1);
    return 0;
}

CMakeList.txt最后加上

find_package(Threads)

target_link_libraries(projectName ${CMAKE_THREAD_LIBS_INIT})