linux多线程环境下的抢尸行为(system返回-1:No child processes)

问题背景:

   我们这边开发了一个动态库给客户用,动态库里面会调用system来做insmod/rmmod的操作。拿到客户那边去测试,会随机性的出现system返回-1的问题,也就是system出错了!但是奇怪的是我们在system返回-1后去lsmod发现实际上insmod/rmmod是成功了的。把当时的errno和对应的出错信息打出来发现errno是10(ECHILD),对应的信息是No child processes。


问题定位:

   早就听说过system函数不靠谱,一方面是安全方面,另一方面是因为其返回值太多,包含不同的含义。近来也确实体会到了这一点,有一次system出错返回的错误码是一个比较大的值,当时错误原因是因为用户的进程里的环境变量是NULL,导致system里面shell的环境变量是NULL,而当时我system是这样写的:system("rmmod xx.ko");直接导致找不到rmmod!后来弄了个绝对路径才解决问题。

   system返回-1,错误码为errno这个问题在goog

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OS error code 0: Success 操作系统错误代码0:成功 OS error code 1: Operation not permitted 操作系统错误代码1:操作不允许 OS error code 2: No such file or directory 操作系统错误代码2:没有这样的文件或目录 OS error code 3: No such process 操作系统错误代码3:没有这样的过程 OS error code 4: Interrupted system call 操作系统错误代码4:中断的系统调用 OS error code 5: Input/output error 操作系统错误代码5:输入/输出错误 OS error code 6: No such device or address 操作系统错误代码6:没有这样的设备或地址 OS error code 7: Argument list too long 操作系统错误代码7:参数列表太长 OS error code 8: Exec format error 操作系统错误代码8:执行格式错误 OS error code 9: Bad file descriptor 操作系统错误代码9:坏的文件描述符 OS error code 10: No child processes 操作系统错误代码10:无子过程 OS error code 11: Resource temporarily unavailable 操作系统错误代码11:资源暂时不可用 OS error code 12: Cannot allocate memory 操作系统错误代码12:无法分配内存 OS error code 13: Permission denied 操作系统错误代码13:权限被拒绝 OS error code 14: Bad address 操作系统错误代码14:错误的地址 OS error code 15: Block device required 操作系统错误代码15:需要块设备 OS error code 16: Device or resource busy 操作系统错误代码16:设备或资源忙 OS error code 17: File exists 操作系统错误代码17:文件已经存在 OS error code 18: Invalid cross-device link 操作系统错误代码18:无效的跨设备链接 OS error code 19: No such device 操作系统错误代码19:没有这样的设备 OS error code 20: Not a directory 操作系统错误代码20:不是一个目录 OS error code 21: Is a directory 操作系统错误代码21:是一个目录 OS error code 22: Invalid argument 操作系统错误代码22:无效参数 OS error code 23: Too many open files in system 操作系统错误代码23:打开太多的文件系统 OS error code 24: Too many open files 操作系统错误代码24:打开的文件太多 OS error code 25: Inappropriate ioctl for device
Linux C环境下,可以使用pthread库来创建多线程并实现归并排序。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> // 定义数据结构 typedef struct { int* array; int start; int end; } ThreadData; // 归并排序函数 void merge(int array[], int start, int mid, int end) { int i = start, j = mid + 1, k = 0; int* temp = (int*)malloc((end - start + 1) * sizeof(int)); while (i <= mid && j <= end) { if (array[i] <= array[j]) temp[k++] = array[i++]; else temp[k++] = array[j++]; } while (i <= mid) temp[k++] = array[i++]; while (j <= end) temp[k++] = array[j++]; for (int p = 0; p < k; p++) array[start + p] = temp[p]; free(temp); } // 归并排序的线程函数 void* merge_sort_thread(void* arg) { ThreadData* data = (ThreadData*)arg; if (data->start < data->end) { int mid = (data->start + data->end) / 2; // 创建两个子线程对数组的两部分分别进行排序 pthread_t tid[2]; ThreadData child_data[2]; child_data[0].array = data->array; child_data[0].start = data->start; child_data[0].end = mid; child_data[1].array = data->array; child_data[1].start = mid + 1; child_data[1].end = data->end; for (int i = 0; i < 2; i++) pthread_create(&tid[i], NULL, merge_sort_thread, &child_data[i]); for (int i = 0; i < 2; i++) pthread_join(tid[i], NULL); // 合并两个有序子数组 merge(data->array, data->start, mid, data->end); } pthread_exit(NULL); } int main() { int n = 10000; // 数据规模 int array[n]; // 初始化数组,这里省略具体代码 ThreadData data; data.array = array; data.start = 0; data.end = n - 1; // 创建归并排序的线程 pthread_t tid; pthread_create(&tid, NULL, merge_sort_thread, &data); pthread_join(tid, NULL); // 输出排序后的结果,这里省略具体代码 return 0; } ``` 在上面的代码中,我们定义了一个`ThreadData`结构体,用于传递数组、起始索引和结束索引给线程函数。`merge_sort_thread`函数是归并排序的线程函数,它首先判断起始索引和结束索引是否满足继续划分的条件,如果满足则创建两个子线程对两个子数组进行排序,然后再合并两个有序子数组。最后,在主函数中创建一个归并排序线程,并等待它的执行完成。 这样,你就可以在Linux C环境使用多线程来实现对数万个数据的归并排序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值