如何在C语言编程中调用linux系统终端下的命令system(执行shell 命令)
相关函数 fork,execve,waitpid,popen
表头文件 #includestdlib.h
定义函数 int system(const char * string);
函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令 , 此命令执行完后随即返回原调用的进程 。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略 。
返回值 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1 。若参数string为空指针(NULL),则返回非零值 。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功 。
附加说明 在编写具有SUID/SGID权限的程序时请勿使用system() , system()会继承环境变量,通过环境变量可能会造成系统安全的问题 。
范例 #includestdlib.h
main()
{
system(“ls -al /etc/passwd /etc/shadow”);
}
执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
linux下运行可执行C文件后怎么退到命令行来?如果C程序运行到之后没能正常结束的话就不会退出到终端会,有两个方法可以解决该问题\x0d\x0a1,在运行程序之前在命令后面加个让程序在后台运行 。\x0d\x0a例如 ./test这个时候程序就不会一直阻塞 , 如果需要终止改程序可以查看该程序的进程号然后杀死该进程例如:ps -aux 找到刚才运行的程序 , 然后kill 进程号 就可以结束改程序了 。\x0d\x0a2.如果程序已经运行了 , 终端已经阻塞 , 那么就使用CtrlC 来结束改程序 , 结束阻塞 。
Linux下怎么用C语言实现:原样输出命令行上所有的参数?用read/write从终端上读入并写回终端?你说的是APUE上的很经典的一个例子
源代码如下:
#include stdio.h
#include stdlib.h
#include unistd.h
#define BUFFSIZE 4096
int main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE))0)
{
if (write(STDOUT_FILENO, buf, n) != n)
{
perror("write error");
exit(1);
}
}
if (n0)
{
perror("read error");
exit(1);
}
exit(0);
}
较原来的作了少许改动,这种代码应该能读懂吧 。
怎么用C语言实现linux的命令命令是查询当前登录的每个用户,它的输出包括用户名、终端类型、登录日期及远程主机,在Linux系统中输入who命令输出如下:
我们先man一下who,在帮助文档里可以看到,who命令是读取/var/run/utmp文件来得到以上信息的 。
我们再man一下utmp,知道utmp这个文件,是二进制文件,里面保存的是结构体数组,这些数组是struct utmp结构体的 。
struct utmp {
shortut_type;
pid_tut_pid;
charut_line[UT_LINESIZE];
charut_id[4];
charut_user[UT_NAMESIZE];
charut_host[UT_HOSTSIZE];
struct {
int32_t tv_sec;
int32_t tv_usec;
} ut_tv;
/***等等***/
};
要实现who只需要把utmp文件的所有结构体扫描过一遍,把需要的信息显示出来就可以c代码linux命令行了,我们需要的信息有ut_user、ut_line、ut_tv、ut_host 。
老师给的初始代码:who1.c运行结果如下:
需要注意的是utmp中所保存的时间是以秒和微妙来计算的 , 所以我们需要把这个时间转换为我们能看懂的时间 , 利用命令man -k time | grep 3搜索C语言中和时间相关的函数:
经过搜索发现c代码linux命令行了一个ctime()函数 , 似乎可以满足我们的需求,于是对代码中关于时间的printf进行修改:
printf("%s",ctime(utbufp-ut_time));
编译运行发现出来的结果虽然已经转换成了我们能看懂的时间格式,但是很明显这个时间是错的:
搜索一下ut_time这个宏,发现它被定义为int32_t类型:
但是ctime()函数中要求参数的类型是time_t类型,所以重新定义一下类型 , 编译运行之后,发现时间已经改成了正确的,但是发现()中的内容被换行了,猜想ctime()函数的返回值可能自动在最后补了一个字符\n:
一开始想通过\r\b来实现“退行”,但实践后发现并不可取 , 最后考虑到直接修改字符串中最后一个字符为\0,让其字符串结束,使输出达到与系统who命令一样的效果,即在输出语句前添加如下代码:
cp[strlen(cp)-1] = '\0'
最后编译执行效果 , 发现解决了该问题:
虽然能看出基本上和who指令的执行结果一致,但是并非完全一样,主要在两点,第一是时间格式不一样 , 第二个是比who执行的结果多了几条,需要注意的是utmp中保存的用户,不仅仅是已经登陆的用户,还有系统的其c代码linux命令行他服务所需要的“用户”,所以在显出所有登陆用户的时候,应该过滤掉其他用户 , 只保留登陆用户 。我们可以通过ut_type来区别,登陆用户的ut_type是USER_PROCESS 。
先用if语句对执行结果进行过滤,效果如下:
接着解决时间格式问题,利用man命令收到了两个非常有用的函数:localtime()和strftime(),localtime()是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间 , strftime()则是用来定义时间格式的,如:年-月-日,利用这两个函数对时间进行修改后,结果显示终于和系统中who命令一模一样:
最终完整的代码如下:
#include stdio.h
#include stdlib.h
#include utmp.h
#include fcntl.h
#include unistd.h
#include time.h
#define SHOWHOST
void show_time(long timeval){
char format_time[40];
struct tm *cp;
cp = localtime(timeval);
strftime(format_time,40,"%F %R",cp);
printf("%s",format_time);
}
【c代码linux命令行 linux c命令】int show_info( struct utmp *utbufp )
{
if(utbufp-ut_type == USER_PROCESS){
printf("%-8.8s", utbufp-ut_name);
printf(" ");
printf("%-8.8s", utbufp-ut_line);
printf("");
show_time(utbufp-ut_time);
printf(" ");
#ifdefSHOWHOST
printf("(%s)", utbufp-ut_host);
#endif
printf("\n");
}
return 0;
}
int main()
{
struct utmpcurrent_record;
intutmpfd;
intreclen = sizeof(current_record);
if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
perror( UTMP_FILE );
exit(1);
}
while ( read(utmpfd, current_record, reclen) == reclen )
show_info(current_record);
close(utmpfd);
return 0;
}
怎么用linux写c语言Linux正在成为开发人员的编程天堂,成为开源和免费操作系统 。Turbo C编译器已经是一种编译程序的旧方法,所以让程序员转向Linux以获得新的编程环境 。在本文中 , 我们将解释如何编写,编译和运行一个简单的C程序 。这将成为您迁移到可以在Linux上编写和执行的更复杂和有用的C程序的基础 。
我们在Ubuntu 18.04 LTS系统上运行了本文中提到的步骤和命令 。
我们将使用Linux命令行工具Terminal,以编译一个简单的C程序 。要打开终端,您可以使用Ubuntu Dash或CtrlAltT快捷方式 。
第1步:安装build-essential软件包
为了编译和执行C程序,您需要在系统上安装必要的软件包 。在Linux终端中以root用户身份输入以下命令:
sudo apt-get install build-essential
系统会要求您输入root用户密码; 安装过程将在此之后开始 。请确保您已连接到互联网 。
第2步:编写一个简单的C程序
安装必要的软件包之后,让我们编写一个简单的C程序 。
打开Ubuntu的图形文本编辑器,将以下示例程序写入或复制到其中:
#includestdio.h
int main()
{
printf("nA sample C program ");
return 0;
}
然后使用.c扩展名保存文件 。在这个例子中,我将我的C程序命名为linuxidc.c
或者 , 您可以通过gedit中的终端编写C程序,如下所示:
gedit linuxidc.c
这将创建一个.c文件,您可以在其中编写和保存程序 。
第3步:使用gcc编译C程序
在终端中,输入以下命令以生成您编写的程序的可执行版本:
句法:
$ gcc [programName].c -o programName
示例:
$ gcc linuxidc.c -o linuxidc
linux 下如何编写c程序,获得命令行结果?void executeShell(const char *shell){
FILE *stream;
char buf[1024];
memset( buf, '\0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中
stream = popen( shell , "r" );//将命令c代码linux命令行的输出 通过管道读?。ā皉”参数)到FILE* stream
fread( buf, sizeof(char), sizeof(buf), stream); //将刚刚FILE* streamc代码linux命令行的数据流读取到buf中
pclose( stream );
printf("%s \n",buf);//打印输出结果
}
c代码linux命令行的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于linux c命令、c代码linux命令行的信息别忘了在本站进行查找喔 。
推荐阅读
- 魔兽游戏直播教程,魔兽直播在什么平台
- mysql清除表数据空间释放,mysql清除表数据空间释放内存
- 僵尸日逃生模拟器ios中文,下载僵尸生存模拟器
- 模拟飞行4游戏,模拟飞行游戏手机版
- Linux命令中bcp linux命令中的竖线
- 坐飞机出行用什么手机好,坐飞机出行需要带什么东西
- 什么是cpu功能,cpu 功能
- 端口映射内网服务器,端口映射内网端口和外网端口
- python函数iris Python函数round31415926,3的值