LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1571|回复: 8

请教:如何通过C语言编程实现安全关闭linux系统和永久修改本机的IP地址?

[复制链接]
发表于 2005-9-8 16:56:37 | 显示全部楼层 |阅读模式
我在做C语言开发的时候,遇到了如下两个问题,可能对大家高手来说不难解决,但对我这个新手来说却折腾了很久还是没有搞定,麻烦大家帮帮我,谢了先。

1、安全关闭系统的问题:
   我通过如下代码试图实现关闭和重新启动linux系统,当我运行这个程序的时候,发现系统会立即关闭,并没有关闭各个服务的过程,和在命令行执行shutdown -h now的效果不一样,请问我实现的关机程序安全吗?会丢数据吗?有没有其更好的实现方法?

int main()
{
        printf("\nPress r to reboot or p to power off.");
        char c = getchar();

        sync();

        int ret;
        if(c=='r')
                ret = reboot(RB_AUTOBOOT);
        else if(c=='p')
                ret = reboot(RB_POWER_OFF);

        return ret;
}


2、永久修改本机IP地址的问题:
   我运行如下程序的时候,发现本机的IP确实被修改成我想要的IP地址了,但关键是重新启动linux的时候,IP地址又恢复到原来的值,请问有没有办法,只通过C语言编程来实现永久修改本机的IP地址,而不需要手工修改/etc/sysconfig/network-scripts/ifcfg-eth0文件?

int main(int argc, char *argv[])
{
        int                        sockfd;
        struct ifreq                ifr;
        struct sockaddr_in        *sin;
       
        if (argc != 3) {
                fprintf(stderr, "Usage: chip <interface> <IP>\n");
                return 1;
        }
       
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                perror("socket error");
                exit(2);
        }
       
        memset(&ifr, 0, sizeof(ifr));
        strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name)-1);
        sin = (struct sockaddr_in *)&ifr.ifr_addr;
        sin->sin_family = AF_INET;
        if (inet_pton(AF_INET, argv[2], &sin->sin_addr) < 0) {
                perror("inet_pton error");
                exit(3);
        }
       
        if (ioctl(sockfd, SIOCSIFADDR, &ifr) < 0) {
                perror("ioctl SIOCSIFADDR error");
                exit(4);
        }
       
        return 0;
}
发表于 2005-9-8 17:38:43 | 显示全部楼层
关注,我正好遇到这样的问题。
回复 支持 反对

使用道具 举报

发表于 2005-9-8 19:11:27 | 显示全部楼层
1. 向/dev/initctl写入命令,看看reboot的源代码,不是很难.
2. 恐怕只有改配置文件。
回复 支持 反对

使用道具 举报

发表于 2005-9-8 19:54:44 | 显示全部楼层
1.可以调整系统的runlevel,具体可man init。
2.如果不想修改配置文件,也可以在启动脚本中加上调用ifconfig的语句来设置网址。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-8 21:06:41 | 显示全部楼层
多谢指点!再麻烦一下,能不能具体给个例子代码?在下对linux下的开发不是很熟,多谢了
回复 支持 反对

使用道具 举报

发表于 2005-9-8 21:18:41 | 显示全部楼层
1. 如果想偷懒,就用system("init 6");
2. 在/etc/rc.local中加
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-9 10:33:16 | 显示全部楼层
麻烦前辈能否具体一点?
回复 支持 反对

使用道具 举报

发表于 2005-9-9 12:35:31 | 显示全部楼层
重启

  1. #include <stdlib.h>
  2. int main(int argc, char *argv[])
  3. {
  4.    system("init 6");
  5.    return 0;
  6. }
复制代码


改IP地址最好的办法还是改/etc/sysconfig/network-scripts/ifcfg-eth0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-9 14:53:12 | 显示全部楼层
非常感谢,第一个问题搞定了,这样子的关机没有安全隐患吧,不会丢数据吧?需要在调用system("init 6");之前调用sync();吗?

    第二个问题,修改/etc/sysconfig/network-scripts/ifcfg-eth0,是只通过C语言打开改文件然后编辑?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表